2011-11-19 27 views
7

Qt(v4.7.4)とBoost(v1.47とv1.48を試しました)をC++プロジェクトで一緒に使用しているときに、<boost\filesystem.hpp>を含むクラスによってリンカエラーが発生します。私はちょうどQtをセットアップして、コードが何の問題もなく動いていた。QtとBoostを使用するとリンカエラーが発生する

これはエラーメッセージです:

... OBJ:エラーLNK2001:未解決の外部シンボル「プライベート:静的クラスのstd :: codecvtのconst * &を後押し__cdecl :: filesystem3 ::パス:: wchar_t_codecvt_facetを(無効) "(ブースト@ filesystem3 @ wchar_t_codecvt_facetの@パス@@ CAAAPBV $ codecvt @ GDH @ STD @@ XZ)

... OBJ:??エラーLNK2001:未解決の外部シンボル" 無効__cdeclブースト:: filesystem3 :: path_traits :: convert(char const *、char const *、クラスstd :: basic_string、クラスstd :: allocator> &、クラス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 &、クラスstd :: basic_string、クラスstd :: allocator> & 、クラスのstd :: codecvtのconstの&)」(?派遣@ path_traits @ filesystem3 GU?$ char_traits @ G @ STD @@ 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_store :: class_string ::クラス:: str :: class :: str :: str :: str :: str :: str :: str :: str :: str :: str :: str :: str :: std :: @@ V $アロケータ@ D @ 2 @@のstd @@ ABV $ codecvt @ GDH 5 @@ Z)

... exeファイル@:??致命的なエラーLNK1120:未解決の外部4

EDIT:

Here私はこの問題を持つ誰かがこの結論に来ました

これは本当にQtの問題です。ネイティブタイプとしてwchar_tを使用するには、同じコンパイラスイッチを使用して Qtを再コンパイルする必要があります。でも トラッカーにバグがあります: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のように聞こえると思います。私たちは、Google BreakpadとICUライブラリでQtを幸せにするために同じことをしなければなりませんでした。 /Zc:wchar_tの設定を(QT_SOURCE)\mkspecs\win32-msvc2008\qmake.confに変更し、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はおそらく、実行時の設定に関してプログラムのヒントを変えてしまいました。つまり、使用するブーストライブラリ(ファイルシステム)は、命名規則によってアクセスされる多くの構成になっています。

たとえば、マルチスレッドのランタイムには、ライブラリ名のどこかにmtが必要です(私はよく覚えていればよいと思いますが、詳細は完全に文書化されています)。この命名法はプログラマにとってはかなり透過的です。なぜなら、異なるコンパイラの下でライブラリの使用を容易にするためにプログラマを適切に使用するプラグマがあるからです。

wchar以外のfilesystem.libが必要です。私はWindowsを使用したとき、JamをVisual C++とのインターフェイスに使用しました(これは過去のものになる可能性がありますmillenium!)。私はそれがまだ使えることを願っています。

+1

私は分かりません。私は 'boost_filesystem-vc100-mt-1_47.lib'を自分の依存関係に加え、' $(BOOST)\ stage \ lib'をディレクトリに追加しました。パスは間違いなく、私はエラーなしでコンパイルされている別のプロジェクトからコピーしました。私はすべてのシートの 'runtime library'プロパティをチェックしました。私の他のプロジェクトと同じように、' multithreaded DLL(/ MD) 'に設定されています。これらの設定は同じなので、命名の問題ではないと思いますか、間違っていますか? – Pedro

+0

申し訳ありませんが、私は誤ってマルチスレッドを参照していました。したがって、_mt_は、文字タイプの変更であることを明確に説明しました。私は、私が自分のヒポテスを適切な技術的な詳細で確認できることを願っています。 – CapelliC

2

boost-1.49を使用すると、Qt 4.4とVS2005に同じ問題がありました。プロジェクトのプロパティに移動し、「設定プロパティ - > C/C++ - >言語 - > wchar_tを組み込み型として扱う」を「はい」に設定すると問題が解決されました。

関連する問題