2011-11-19 115 views
7

當我在我的C++項目中一起使用Qt(v4.7.4)和Boost(嘗試v1.47和v1.48)時,出現由包含<boost\filesystem.hpp>的類導致的鏈接器錯誤。我只是設置了Qt,在代碼運行之前沒有任何問題。使用Qt和Boost時的鏈接器錯誤

這是錯誤消息:

... OBJ:錯誤LNK2001:無法解析的外部符號「私人:靜態類的std ::常量的codecvt * & __cdecl的boost :: filesystem3 ::路徑:: wchar_t_codecvt_facet(無效) 「(wchar_t_codecvt_facet @路徑@ filesystem3 @升壓@@ CAAAPBV $ @的codecvt GDH @ STD @@ XZ)

... OBJ:?錯誤LNK2001:無法解析的外部符號」 無效__cdecl的boost :: filesystem3 :: path_traits :: convert(char const *,char const *,class std :: basic_string,class std :: allocator> &,class std :: codecvt const &)「(?convert @ p ath_traits @ filesystem3 @ boost @@ YAXPBD0AAV?$ basic_string @ GU?$ char_traits @ G @ std @@ V $ $ allocator @ G @ 2 @@ std @@ ABV?$ codecvt @ GDH @ 5 @@ Z)

... obj:錯誤LNK2001:無法解析的外部符號「void __cdecl boost :: filesystem3 :: path_traits :: dispatch(class boost :: filesystem3 :: directory_entry const &,class std :: basic_string,class std :: allocator> & ,class std :: codecvt const &)「(?dispatch @ path_traits @ filesystem3 @ boost @@ YAXABVdirectory_entry @ 23 @ AAV?$ basic_string @ GU?$ char_traits @ G @ std @@ V $ $ allocator @ G @ 2 @@ std @@ ABV?$ codecvt @ GDH @ 6 @@ Z)

... obj:錯誤LNK2001:無法解析的外部符號「void __cdecl boost :: filesystem3 :: path_traits :: convert(unsigned short const *,unsigned簡短st * :: class std :: basic_string,class std :: allocator> &,class std :: codecvt const &)「(?convert @ 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我發現有這個問題,得出這一結論的人:

這確實是一個Qt問題。使用wchar_t作爲本機類型,您必須使用相同的編譯器開關重新編譯Qt。甚至有在 跟蹤了一個錯誤:https://bugreports.qt.io/browse/QTBUG-9617

一般情況下,你必須非常小心,不要在你的項目中混合wchar_t的 編譯器設置,因爲它們會變得不兼容。

所以我重新編譯了Qt設置/Zc:wchar_t,但沒有顯示任何效果。我仍然得到同樣的錯誤。

+0

你有編譯boost嗎?我不太瞭解建築的確切需求,但一些圖書館的工作。 – pezcode

+0

是的。如果我沒有記錯的話,我已經使用'b2.exe'編譯了Visual Studio 2010。 – Pedro

+0

可能需要重新編譯整個boost庫嗎?我不記得確切的編譯配置,但是我在編譯boost時確實沒有改變'將wchar_t作爲內建類型屬性。 – Pedro

回答

8

我認爲你是在正確的軌道上,但它聽起來像你的-Zc:wchar_t沒有「堅持」。我們必須做同樣的事情才能讓Qt對Google Breakpad和ICU庫感到滿意。我們更改(QT_SOURCE)\mkspecs\win32-msvc2008\qmake.conf中的/Zc:wchar_t設置並從源代碼編譯Qt,之後一切正常。

當您構建使用Qt和Boost的項目時,應該在編譯器輸出中看到此選項。喜歡的東西:

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

如果你已經建立Qt的沒有這個選項,你可能需要做一個make confclean首先要保證一切真的獲取與新設置重建。

聽起來像是-Zc:wchar_t will be the default in Qt 5

0

Qt可能會改變你的程序的運行時配置方面的技巧:因此,你使用的boost庫(文件系統),可以通過命名約定訪問許多配置 - 無法找到。例如,多線程運行時需要mt某處的庫名稱(我希望我記得很清楚,但無論如何請參閱完整記錄詳細信息的文檔)。這個命名對於程序員來說是相當透明的,這是因爲編譯指示可以促進程序員適當地使用它來緩解不同編譯器下的庫使用。

您應該錯過非wchar filesystem.lib。當我使用Windows時,我使用boost Jam與Visual C++接口(可能會回到過去的千年版!)。我希望它仍然可用。

+1

我不知道我明白。我在我的依賴和'$(BOOST)\ stage \ lib'目錄中添加了'boost_filesystem-vc100-mt-1_47.lib'。路徑非常好,我從另一個項目中複製了它們,這是編譯時沒有錯誤。我檢查過我的所有工作表的'runtime library'屬性,並且它們都設置爲'多線程DLL(/ MD)',就像在我的其他項目中一樣。由於這些設置是相同的,我假設它不能是一個命名問題,或者我錯了嗎? – Pedro

+0

對不起,我不正確地提到多線程,因此_mt_,你清楚地解釋了這是字符類型的變化。我希望我可以通過適當的技術細節來提高我的速度。 – CapelliC

2

使用boost-1.49,Qt 4.4和VS2005有同樣的問題。轉到項目屬性,然後設置「配置屬性 - > C/C++ - >語言 - >將wchar_t作爲內置類型」設置爲「是」解決了該問題。