2011-11-19 20 views
7

내 C++ 프로젝트에서 Qt (v4.7.4)와 부스트 (v1.47과 v1.48을 시도한)를 함께 사용하면 <boost\filesystem.hpp>을 포함하는 클래스로 인해 링커 오류가 발생합니다 . 난 그냥 Qt는을 설정하고 코드 앞에 아무 문제없이 작동했다.Qt와 부스트를 사용할 때 링커 오류가 발생했습니다.

... OBJ : 오류 LNK2001 :

는 오류 메시지입니다 확인되지 않은 외부 기호 "개인 : 정적 클래스 표준 : : codecvt의 CONST * &이 향상 __cdecl :: filesystem3를 :: 경로 : wchar_t_codecvt_facet을 (void?) "(? wchar_t_codecvt_facet @ path @ filesystem3 @ boost CAFAPBV? $ codecvt @ GDH @ std @@ XZ)

... obj : 오류 LNK2001 : 해결되지 않은 외부 기호"void __cdecl boost :: filesystem3 :: path_traits :: 변환 (숯불 CONST의 *, 숯불 CONST *, 클래스 표준 : : basic_string, 클래스 표준 : : 할당> &, 클래스 표준 : : codecvt의 CONST &) "(? @ p를 변환 ath_traits @ 파일 시스템 3 @ 부스트 @@ YAXPBD0AAV? $ basic_string @ GU? char_traits @ G @ std @@ V? $ 할당 자 @ G @ 2 @@ std @@ ABV? $ codecvt @ GDH @ 5 @@ Z)

... obj : 오류 LNK2001 : 확인되지 않은 외부 기호 "void __cdecl boost :: filesystem3 :: path_traits :: dispatch (class boost :: filesystem3 :: directory_entry const &, 클래스 std :: basic_string, 클래스 std :: allocator> & 클래스 표준 : : codecvt의 CONST &) "(? 파견 @ path_traits @ filesystem3를 GU? $ char_traits @ G @ 표준 @@ V @ 부스트 @@ YAXABVdirectory_entry @ 23 @ AAV? $ basic_string @? $ 2 @ @ G 할당 @@ std @@ ABV? $ codecvt @ GDH @ 6 @@ Z)

... obj : 오류 LNK2001 : 해결되지 않은 외부 기호 "void __cdecl boost :: filesystem3 :: path_traits :: convert (unsigned short const *, unsigned 짧은 죄수 st * :: class_string :: 클래스의 std :: allocator 클래스 &, 클래스 std :: codecvt const &) "? @ path_traits @ filesystem3 @ boost @@ YAXPBG0AAV? $ basic_string @ DU? $ char_traits @ D @ std @@ V $ @ 할당 D @ 2 @@ STD @@ ABV $ @ codecvt GDH 5 @@ Z)

... EXE @? 심각한 오류 LNK1120 4 개되지 않은 외부

편집 :

Here 내가 찾은 사람이 결론에 오는이 문제 갖는

,369을

이 정말 Qt는 문제입니다. Qt는이 같은 컴파일러 스위치를 사용하여 컴파일하면 에있는 기본 유형으로 wchar_t를 사용. 일반적으로 https://bugreports.qt.io/browse/QTBUG-9617

당신은 매우 신중해야하고 그들이 호환 될 것 같은 프로젝트에서 컴파일러 설정 wchar_t를 함께 사용하지 마십시오 : 심지어 추적기에 버그가 있습니다.

그래서 Qt 설정을 /Zc:wchar_t으로 다시 컴파일했지만 어떤 효과도 보이지 않았습니다. 나는 여전히 같은 오류가 발생합니다.

+0

부스트를 컴파일하셨습니까? 나는 건물을 정확히 필요로하지만 도서관이하는 일에 너무 익숙하지 않습니다. – pezcode

+0

예. 제대로 기억한다면'b2.exe'를 사용하여 Visual Studio 2010 용으로 컴파일했습니다. – Pedro

+0

전체 부스트 라이브러리를 다시 컴파일해야 할 수도 있습니까? 나는 정확한 빌드 구성을 기억하지 못한다.하지만 boost 컴파일 할 때'build-in type' 속성으로'wchar_t 취급 '을 변경하지 않았다. – Pedro

답변

8

나는 올바른 길을 가고 있다고 생각하지만, -Zc:wchar_t은 "스틱"하지 않은 것처럼 들립니다. Qt가 Google Breakpad 및 ICU 라이브러리에 만족하도록하기 위해 동일한 작업을 수행해야했습니다. /Zc:wchar_t 설정을 (QT_SOURCE)\mkspecs\win32-msvc2008\qmake.conf으로 변경하고 소스에서 Qt를 컴파일 한 다음 모든 것이 작동합니다.

Qt와 부스트를 사용하는 프로젝트를 빌드 할 때 컴파일러 출력에이 옵션이 표시되어야합니다. 같은 뭔가 : 이미이 옵션을 사용하지 않고 Qt를 구축 한 경우

cl -c -nologo -Zm200 -Zc:wchar_t ... (etc.) 

, 당신은 정말가 새로운 설정으로 재 구축됩니다 모든 을 보장하기 make confclean 먼저해야 할 수 있습니다.

-Zc:wchar_t will be the default in Qt 5처럼 들립니다.

0

Qt는 런타임 구성과 관련하여 프로그램의 팁을 변경했을 가능성이 높습니다. 따라서 사용하는 부스트 라이브러리 (파일 시스템)가 명명 규칙에 따라 액세스되는 많은 구성으로 제공됩니다.

예를 들어, 멀티 스레드 런타임은 라이브러리 이름 어딘가에 mt이 필요합니다. (어쨌든 세부 사항이 자세히 기록 된 문서는 기억이 잘 나기를 바랍니다.)이 이름은 프로그래머가 다른 컴파일러에서 라이브러리 사용을 쉽게하기 위해 적절하게 사용하는 pragma 때문에 프로그래머에게 상당히 투명합니다.

wchar이 아닌 filesystem.lib을 놓치십시오. Windows를 사용했을 때 Visual C++와의 인터페이스에 Jam을 사용했습니다 (이전에 돌아갈 수 있습니다 millenium!). 아직도 사용할 수 있기를 바랍니다.

+1

이해할 수 있는지 잘 모르겠습니다. 나는'boost_filesystem-vc100-mt-1_47.lib'을 내 의존성에 추가했고'$ (BOOST) \ stage \ lib'를 디렉토리에 추가했습니다. 경로는 확실히 괜찮습니다. 오류없이 컴파일하는 다른 프로젝트의 경로를 복사했습니다. 나는 모든 시트의'runtime library' 속성을 검사했고, 다른 프로젝트와 마찬가지로'multithreaded DLL (/ MD)'로 설정되어 있습니다. 이러한 설정은 동일하기 때문에 이름 지정 문제가 될 수 없다고 생각하거나 잘못된 것입니까? – Pedro

+0

죄송합니다, 나는 멀티 스레드를 부적절하게 참조 했으므로 _mt_, 당신은 명확하게 그것이 문자 유형의 변화라고 설명했습니다. 나는 나의 hipotesis를 부스트, 적절한 기술적 세부 사항으로 확인할 수 있기를 바랍니다. – CapelliC

2

부스트 1.49를 사용하면 Qt 4.4와 VS2005에서 같은 문제가 발생합니다. 프로젝트 속성으로 이동 한 다음 "구성 속성 -> C/C++ -> 언어 -> 내장 유형으로 wchar_t 처리"를 "예"로 설정하면 문제가 해결됩니다.

관련 문제