2016-08-05 2 views
1

Windows (VS2015)에서 여러 파일 형식을 읽을 수있는 프로그램 (C++)을 만들려고합니다. 이를 위해 MyProgram 프로젝트 (주 프로그램)와 MyLibrary 프로젝트 (여러 파일 형식에 대한 여러 가지 구문 분석기 포함)를 사용하여 솔루션을 만들었습니다. MyProgram에서 프로그램 입력을 기반으로 파서 개체를 만듭니다.자체 라이브러리를 다른 라이브러리에 연결하는 정적 라이브러리에 프로그램 연결

모든 것이 잘 작동하고있었습니다.

그러나 외부 라이브러리 인 nifticlib를 사용하여 정적 라이브러리로 다운로드하고 컴파일 한 새로운 파일 형식 파서 (NiftiParser)를 만들려고했습니다.

그래서 NiftiParser 클래스를 만들었습니다.이 클래스는 몇 가지 메서드를 구현하며 내부적으로 nifticlib를 호출합니다. 프로젝트 속성에 include dir 및 library dir을 추가했는데 오류없이 컴파일되었습니다. 그런 다음 생성 된 Parser.lib가 있습니다.

1>------ Build started: Project: Parser, Configuration: Debug x64 ------ 
1> nifti_parser.cc 
1> Parser.vcxproj -> C:\Users\Laurent\Documents\C++-build\Projects\Parser\Debug\Parser.lib 
2>------ Build started: Project: MyProgram, Configuration: Debug x64 ------ 
2>Parser.lib(nifti_parser.obj) : error LNK2019: unresolved external symbol nifti_image_read referenced in function "public: __cdecl NiftiParser::NiftiParser(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" ([email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z) 
2>C:\Users\Laurent\Documents\C++-build\Projects\Debug\MyProgram.exe : fatal error LNK1120: 1 unresolved externals 
========== Build: 1 succeeded, 1 failed, 3 up-to-date, 0 skipped ========== 

나는 이런 일이 왜 이해 확실하지 않다 : 나는 MyProgram를 컴파일하려고 할 때

하지만, 난 안 해결되고 nifticlib 라이브러리의 일부 기능에 대한 오류가 발생했습니다. 내가 포함하는 경로와 nifticlib의 라이브러리 디렉토리를 MyProgram 프로젝트에 추가하려고 시도했지만 여전히 문제가 있습니다.

저는 Visual Studio (Linux에서 작업하던 곳)의 컴파일/연결 프로세스가 무엇인지 이해할 수 없습니다.

프로젝트는 정적 라이브러리 인 경우에만 컴파일되고 연결 부분은 프로그램 자체를 컴파일하려고 할 때 발생합니다. 맞습니까?

또한, nifticlib가 연결되어야하는 위치가 확실하지 않습니다. Parser.lib (라이브러리의 기능을 사용하는 곳) 또는 프로그램에 직접 연결해야합니까?

감사합니다.

추신 : nifticlib의 설치 디렉토리에는 헤더와 .lib 만 있습니다. .cpp 파일도 필요합니까, 아니면 .lib에 이미 포함되어 있습니까?

편집 : 좋아, 내가 Parser.lib을 컴파일 어떤 문제를하지 않은 이유는 nifticlib에 연결하지 않기 때문에 즉, 아마 그래서 분명히 아무것도에 연결하지 않는 정적 라이브러리로 뭔가를 구축, MyProgram은 그것을 필요로합니다. Parser 프로젝트에 nitficlib의 include dir 만 포함시켜야하고 Parser.lib와 nifticlib을 MyProgram 프로젝트에 넣어야합니까?

답변

3

Visual Studio의 컴파일 링/링크는 Linux 툴체인에서 발생하는 것과 많이 다르지 않습니다. 바이너리 (실행 파일 또는 동적 라이브러리)를 만들 때 모든 외부 심볼을 ​​확인해야합니다. GCC에서는 링커에 라이브러리를 지정해야합니다. 명령 행 옵션 -lmath은 라이브러리 검색을 위해 설정된 경로 중 하나에서 libmath.a을로드하고 실행 가능 이미지를 빌드 할 때이를 사용하도록 링커에 지시합니다.

마찬가지로 VS에서도 라이브러리 디렉토리 경로를 설정하고 라이브러리 파일을 명시 적으로 나타내야합니다. 이것은 대개 프로젝트 속성 -> 링커 -> 입력 -> 추가 종속성에서 수행됩니다. Windows에서 전체 라이브러리 이름 (MyLib)을 넣으면됩니다.LIB)가 아닌 부분은

.A LIB 사이 또한 Windows에서 동적 라이브러리 (.DLL)의 바이너리로 연결되어서는 안됩니다. 당신을 위해 가져 오기 라이브러리 (.lib)가 필요합니다.

정적 라이브러리를 만들 때 툴체인은 외부 참조를 확인하지 않습니다. 그래서 .lib는 nifticlib을 참조하지 않고 잘 컴파일됩니다.

nifticlib를 어디에 연결해야하는지는 상황에 따라 다릅니다. MyLibrary 만 nifticlib의 기능을 사용하는 경우 정적 라이브러리와 링크하는 것이 좋습니다. 그러나 언젠가 MyProgram에서 nifticlib의 일부 기능을 사용하려면 링크 시간에 충돌이있을 수 있습니다. 이 경우에는 MyProgram을 빌드 할 때만 nifticlib를 링크해야합니다.

엄지 손가락의 규칙은 다음과 같이 공식화 할 수 있습니다 단지에 MyLibrary는 nifticlib의 헤더를 사용하고

  • 경우, 제 3 자에게 귀하의 라이브러리를 링크 MyProgram도 nifticlib의 헤더를 사용하는 경우 하나의
  • (실제로 함수를 호출 할 때), 마이크로 프로그램을 빌드 할 때 nifticlib를 연결하는 것이 더 좋습니다.

이것은 엄격한 설명이 아니며 더 복잡한 경우가 있지만 기본적으로는 이와 같습니다.

그리고 다른 프로젝트의 라이브러리에 연결할 때 정적 라이브러리를 빌드 할 때 사용되는 cpp 파일이 필요하지 않습니다. 라이브러리 .cpp의 내용은 이미 정적 인 lib 파일에 객체 코드 형식으로 포함되어 있습니다.

편집 -> 도서관 -> 일반 -> 추가 종속성을 거기

를 외부 lib 디렉토리를 넣어 다른 정적 라이브러리에서 외관 당신에게 정적 라이브러리를 링크 할 경우, 당신은 속성을 프로젝트에 갈 필요가
+0

매우 완벽한 답변을 해주셔서 감사합니다. 나는 지금 그것을 알아낼 수 있어야한다. 또 하나의 질문이지만 입력 -> 추가 종속성에 라이브러리를 추가 할 때 전체 경로 또는 라이브러리 이름 만 지정해야합니까? – whiteShadow

+0

그냥 이름입니다. 디렉토리 경로는 VC++ 디렉토리 -> 라이브러리 디렉토리에 지정됩니다. 또한 MyLibrary와 MyProgram 프로젝트가 동일한 솔루션 내에 있으면 라이브러리 디렉토리에 대해 전혀 염려 할 필요가 없습니다. VS는 앱의 다른 버전 (디버그/릴리스, x86/x64 등)을 빌드하는 경우를 포함하여 올바르게 파악할 수 있어야합니다. 라이브러리 이름을 종속성에 넣기 만하면됩니다. –

+0

도움을 많이 주셔서 감사합니다. VS에서 나를 혼란스럽게 생각하는 것은 정보를 어디에 넣을 것인가입니다. 필자는 솔루션, 프로젝트 등의 개념에 익숙하지 않고 라이브러리 디렉토리를 어디에 둘 것인지 ... Linux에서는 커맨드 라인이나 cmake를 사용하여 쉽게 찾을 수 있습니다. 하지만 고마워요 : D – whiteShadow

관련 문제