2016-07-17 2 views
1

Visual Studio (2015는 나를 위해) 헤더 파일에서 .lib 파일 이름을 검색하는 방법을 이해가 안됩니다. 내가 boost/asio을 사용하여 1

LNK2019 대신 Visual Studio LNK1104

예는 HTTP 요청을 통해 연결하는 간단한 프로그램을 작성합니다. 원본 파일의 위에는 <boost/asio.hpp>이 포함되어 있습니다. 나는 또한 부스트의 폴더를 가리 키도록 C/C++/General/Additional Include Directories을 설정한다.
그 후, 나는 솔루션을 구축하고 오류 발생 :

Error LNK1104 cannot open file 'libboost_system-vc140-mt-gd-1_61.lib' 

을하지만 비주얼 스튜디오에서 이름 libboost_system-vc140-mt-gd-1_61.lib을 찾아 어디 모르겠어요.
- 모두 평가 된 가치와 상속 값 Linker/Input/Additional Dependencies/Edit...에서 찾고은라는 이름의 항목이없는
libboost_system-vc140-mt-gd-1_61.lib - 어떻게 든로 <boost/asio.hpp>에서 컴파일러에 대한 몇 가지 정보를 설정하는 것이 생각 : 당신이 LIB 파일이 필요하면 libboost_system-을 찾아을 " vc140-MT-GD-1_61.lib, 그것은 광산의 구현 libboost_system-vc140-MT-GD-1_61.lib "
enter image description here

"를,하지만 난 부스트 폴더 검색, 어떤 소스 파일이 포함하지있다 "


일반적으로 헤더 파일에 선언 된 일부 함수가 Visual Studio에서 해당 파일을 구현할 수없는 경우 LNK2019: unresolved external symbol ...이 발생합니다.
그런 다음 해당 구현 도구가 abcxyz.lib 파일에있는 경우 사용자는 Linker/Input/Additional Dependencies으로 이동하고 abcxyz.lib, 없이 추가하고 .lib 파일이 들어있는 폴더를 Linker/General/Additional Libary Directories에 지정합니다. 이 경우 Error LNK1104 cannot open file 'abcxyz.lib'이 던져 질 것입니다.

위의 예에서 LNK2019 오류 대신 LNK1104 오류가 발생하는 이유는 무엇입니까?

예 2
저는 OpenCV 2.4.10 라이브러리를 사용하는 프로젝트에서 일하고 있습니다. 배포판에서 그들은 나에게 라이브러리를 첨부하지 않고 소스 코드가있는 프로젝트를 내게 제공합니다.
그런 다음 최신 OpenCV 2.4.13을 다운로드하고 추가 포함 폴더, 추가 라이브러리 폴더, 추가 종속성 (opencv_core2413.lib)과 같은 프로젝트를 설정합니다.
모든 확인처럼 보이지만 내가 프로젝트를 빌드 할 때, 그것은 나에게 오류 제공하지 않습니다 :

Error LNK1104 cannot open file 'opencv_core2410d.lib' 

내가 모두 평가되는 값에 Linker \ Input \ Additional Dependencies 보았다 (opencv_core2413.lib 포함) 및 값을 상속를,하지만이 항목은 'opencv_core2410d.lib'입니다.
프로젝트가 적용되는 또 다른 공유 속성 시트에서 찾고 시도하지만의 여기 일이 제가이 항목을 삭제하고 싶지만 그래서

입니다 찾을 수 없습니다 'opencv_core2410d.lib'
라는 이름의 입력 항목이 없다 ? 어떤 사람이 나에게 설명해 줄 수 있니? 감사합니다.

+1

'libboost_system-vc140-mt-gd-1_61.lib'는'#pragma comment (lib libboost_system-vc140-mt-gd-1_61.lib)'에서 유래했습니다. http://www.boost.org/doc/libs/1_61_0/boost/config/auto_link.hpp – drescherjm

+0

'opencv_core2410d.lib'는 디버그 빌드에 필요한 디버그 가져 오기 라이브러리입니다. – drescherjm

+1

다음은 #pragma comment (lib libname)에 대한 자세한 사용법입니다. http://stackoverflow.com/questions/5184889/how-does-the-c-linker-know-which-lib-contains-which-functions – drescherjm

답변

0

, 당신은 .OBJ 파일로이 라이브러리 경로에 libname를 찾기 위해 링커가 발생하고 올바른 라이브러리를 사용 보장

#pragma comment(lib, "libname.lib") 

사용하여 라이브러리 요청을 주입 할 수 있습니다.

링크에서 /nodefaultlib을 사용하여 비활성화 할 수 있습니다.

윈도우의 경우 클래스의 구현이 릴리스와 디버그 사이에서 변경됩니다 (추가 추적 멤버가 디버그의 구조에 추가됨).

Tidy up 및 CRT 시작을 구현하기위한 메커니즘은 DllMain이 호출되는지 여부에 따라 다릅니다.

최근의 비주얼 스튜디오는 또한 "값"에 대한 값으로 각각의 오브젝트 파일에 선언을두고

#pragma detect_mismatch("name", "value") 

있습니다. 이렇게하면 구조가 버전 또는 컴파일 옵션간에 변경되면 서로 호환되지 않게됩니다.

1

LNK1104Library Directories에 라이브러리 위치를 설정해야한다는 것을 알 수 있습니다.

boost::asio은 오류 메시지의 경우 boost::system에 따라 다릅니다. boost::system이 아니며,은 헤더 전용 라이브러리입니다.

boost 라이브러리의 위치를 ​​솔루션의 속성 페이지에있는 VC++ Directories 아래 Library Directories에 추가해야합니다.

boost 라이브러리를 아직 만들지 않은 경우 문서 작성 방법은 here이거나 here에서 다운로드 할 수 있습니다.

OpenCV 라이브러리의 위치를 ​​솔루션의 속성 페이지에 추가하면 Example 2을 수정해야합니다. 비주얼 스튜디오와

관련 문제