4

BoostProComputingインストーラーによってインストールされたBoostライブラリを使用しています。Windows764ビットマシンでVS2010を使用しています。リンクして動的にブーストしたいので、インストーラーで最初の2つのオプションを選択しました(マルチスレッドデバッグDLLとマルチスレッドDLL、これらは呼び出されたと思います)。インストールされているライブラリの例は次のとおりです。

boost_bzip2-vc100-mt-1_51.lib
boost_bzip2-vc100-mt-gd-1_51.lib

私のプロジェクトでブーストにリンクするとき、私はまたを定義することを確認しましたBOOST_ALL_DYN_LINK。私は特にfilesystemツールセットを使用しています。

オンにBOOST_LIB_DIAGNOSTICすると、ビルド出力に次のメッセージが表示されます。

1>  Linking to lib file: boost_filesystem-vc100-mt-gd-1_51.lib
1>  Linking to lib file: boost_system-vc100-mt-gd-1_51.lib

ただし、それらはすぐに次のようにフォローアップされます。

1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const __thiscall boost::filesystem::path::string(void)const " (__imp_?string@path@filesystem@boost@@QBE?BV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall boost::filesystem::path::~path(void)" (__imp_??1path@filesystem@boost@@QAE@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class boost::filesystem::path __cdecl boost::filesystem::detail::unique_path(class boost::filesystem::path const &,class boost::system::error_code *)" (__imp_?unique_path@detail@filesystem@boost@@YA?AVpath@23@ABV423@PAVerror_code@system@3@@Z) referenced in function "class boost::filesystem::path __cdecl boost::filesystem::unique_path(class boost::filesystem::path const &)" (?unique_path@filesystem@boost@@YA?AVpath@12@ABV312@@Z)
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class std::codecvt<wchar_t,char,int> const & __cdecl boost::filesystem::path::codecvt(void)" (__imp_?codecvt@path@filesystem@boost@@SAABV?$codecvt@_WDH@std@@XZ) referenced in function "public: __thiscall boost::filesystem::path::path<char const [20]>(char const (&)[20],void *)" (??$?0$$BY0BE@$$CBD@path@filesystem@boost@@QAE@AAY0BE@$$CBDPAX@Z)
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl boost::filesystem::path_traits::convert(char const *,char const *,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > &,class std::codecvt<wchar_t,char,int> const &)" (__imp_?convert@path_traits@filesystem@boost@@YAXPBD0AAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@ABV?$codecvt@_WDH@5@@Z) referenced in function "void __cdecl boost::filesystem::path_traits::dispatch<class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > &,class std::codecvt<wchar_t,char,int> const &)" (??$dispatch@V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@path_traits@filesystem@boost@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@4@ABV?$codecvt@_WDH@4@@Z)
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (__imp_?generic_category@system@boost@@YAABVerror_category@12@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'posix_category''(void)" (??__Eposix_category@system@boost@@YAXXZ)
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class boost::system::error_category const & __cdecl boost::system::system_category(void)" (__imp_?system_category@system@boost@@YAABVerror_category@12@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'native_ecat''(void)" (??__Enative_ecat@system@boost@@YAXXZ)

auto-link.hpp私のために私のリンクの世話をするべきではありませんか?自動リンカがすべてを正しく識別しているように見えるため、プロジェクトにリンクするように特に要求しているわけではありません。それで、私がこれらのものを見逃しているのはどうしてですか?また、それらはとして宣言されているdllimportので、リンカーはそれらをそのままにして、実行時に検出されることを期待するべきではありませんか?

ありがとう!

更新:2番目のリンカーエラーについて詳しく説明することにしました。path基本的には、クラスのデストラクタが見つからないと言っています。ライブラリで実行dumpbinした後、次の行ファイルにfilesystemあることに気付きました。

??1path@filesystem@boost@@QEAA@XZ (public: __cdecl boost::filesystem::path::~path(void))

しかし、これは明らかにリンカーが探しているものと一致しません。これは次のとおりです。

"__declspec(dllimport) public: __thiscall boost::filesystem::path::~path(void)" (__imp_??1path@filesystem@boost@@QAE@XZ)

リンカがDLLインポートバージョンを探していることに注意してください。ただし、ライブラリ自体はDLLインポートバージョンを提供していないようです...ここからどこに行くべきかわかりませんが、重要な情報のようです。

4

3 に答える 3

5

私の場合、これは「wchar_tを組み込み型として扱う」オプションがfalseに設定されていたため、wchar_tとしてコンパイルされたためunsigned shortです。

于 2013-03-01T21:27:54.803 に答える
4

これらの.libがすでにコンパイルされていると仮定すると、.libファイルがライブラリパスにあることを確認する必要があります(VC++ディレクトリ->ライブラリパスを参照)。

コンパイラはコンパイル時にDLLへのリンクを配置し、.libを使用して正しいエントリポイントなどを検出するため、EXE/DLLが実行時に起動したときに効率的にロードできます。

あなたが話しているランタイムDLLディスカバリーのタイプは、BoostがサポートしていないLoadLibrary+GetProcAddressタイプコードを必要とします。

(静的リンクは、実際には、統計的にコンパイルされた.libコードからDLL / EXEにコードを配置します。)

編集:また、アーキテクチャに正しい.libファイル(32ビットや64ビットなど)を使用していることを確認してください。これにより、署名で同様のエラーが発生します。

dumpbin /headers 

.libが構築された「マシン」タイプを教えてくれます(dumpbin出力の最初のセクション)。

于 2012-10-03T19:29:08.033 に答える
1

(未解決のリストから)呼び出し規約に違いがあります。これにより、シンボルが一致しなくなります。Windowsの呼び出し規約として_cdecl以外でコンパイルしようとすると、1.54.0ではすべてのライブラリがコンパイルされないことがわかりました。Windowsは多くの異なる呼び出し規約が好きで、それらは一致しません( _cdecl / Gd、__ stdcall / Gz、__ FASTCALL / Gr)また、少なくとも1.54.0では、一部のライブラリでwchar_tをビルドとして扱う必要があることに気付きました-タイプ(WindowsVSオプション/Zc:wchar_t)(確かにboost :: logライブラリ)。この場合、wchar_tはunsigned shortと一致しないため、これによって未解決のエラーも発生します。

于 2013-09-12T17:49:24.610 に答える