2

Windows で mongo db クライアントの例をコンパイル中にリンカーの問題が発生しました。Visual Studio 2012 を使用しています。

mongo の git からsrc\mongo\client\examples\clientTest.cppをコンパイルしようとしています。

次の手順を実行しました。

  • bjam2 を使用して Boost v1.51 をビルドしました。別のプロジェクトで使用しているので、バイナリが優れていることはわかっています。
  • MongoDB C++ ドライバーをscons --dd mongoclient.lib
  • 追加のインクルード ディレクトリとしてプロジェクトに追加されたブースト インクルード ディレクトリ。
  • _CRT_SECURE_NO_WARNINGS を定義して、MongoDB クライアント コードによる strncpy などの使用に関する警告を回避します。
  • プロジェクトにブースト (バイナリ) ライブラリ ディレクトリを含めます。

それでも、次のエラーが表示されます

1>mongoclient.lib(log.obj) : error LNK2019: unresolved external symbol "void __cdecl boost::filesystem3::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 &)" (?convert@path_traits@filesystem3@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::filesystem3::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@filesystem3@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>mongoclient.lib(log.obj) : error LNK2019: unresolved external symbol "private: static class std::codecvt<wchar_t,char,int> const * & __cdecl boost::filesystem3::path::wchar_t_codecvt_facet(void)" (?wchar_t_codecvt_facet@path@filesystem3@boost@@CAAAPBV?$codecvt@_WDH@std@@XZ) referenced in function "public: static class std::codecvt<wchar_t,char,int> const & __cdecl boost::filesystem3::path::codecvt(void)" (?codecvt@path@filesystem3@boost@@SAABV?$codecvt@_WDH@std@@XZ)
1>mongoclient.lib(log.obj) : error LNK2019: unresolved external symbol "class boost::filesystem3::file_status __cdecl boost::filesystem3::detail::status(class boost::filesystem3::path const &,class boost::system::error_code *)" (?status@detail@filesystem3@boost@@YA?AVfile_status@23@ABVpath@23@PAVerror_code@system@3@@Z) referenced in function "bool __cdecl boost::filesystem3::exists(class boost::filesystem3::path const &)" (?exists@filesystem3@boost@@YA_NABVpath@12@@Z)
1>mongoclient.lib(background.obj) : error LNK2019: unresolved external symbol "public: __thiscall boost::thread::~thread(void)" (??1thread@boost@@QAE@XZ) referenced in function "public: class mongo::BackgroundJob & __thiscall mongo::BackgroundJob::go(void)" (?go@BackgroundJob@mongo@@QAEAAV12@XZ)

#pragma comment libしたがって、ブーストのヘッダーのディレクティブを無視しているようです。

プロジェクト設定のタブに明示的に追加libboost_thread-vc110-mt-sgd-1_51.libしてみました。Linker/Input役に立ちませんでした。

#pragma comment(lib, "libboost_thread-vc110-mt-sgd-1_51.lib")例のメインcppファイルに指定してみました。それも役に立ちませんでした。

しかし!追加する

#include <boost/thread/thread.hpp>

boost::thread _thrd(&Func);
_thrd.join();

clientTest.cpp の冒頭で、boost::thread::~thread(void) の欠落に関するエラーを取り除くのに役立ちました。リンカーにスレッドの lib バイナリへのリンクを強制したようです。

残念ながら、このトリックを繰り返して<boost/filesystem.hpp>も役に立ちませんでした:(

また、Boost およびMongoクライアントのすべての LIB ファイルが、dumpbin.exe.

他に何がありますか?

ありがとう!

4

2 に答える 2

1

mongo-devメーリングリストへのメッセージが宛先に届かないようです。おそらくそれは事前にモデレートされています。

しかし、これまでSconsを使用したことがなかったため、少しハッキーなソリューションを介してそれを機能させることができました。

問題の核心は、mongoにBoost 1.49があらかじめバンドルされており、システムにBoost1.51がインストールされていることでした。mongoが1.49でコンパイルされている間に、ブースト1.51に対してサンプルをコンパイルしようとしたため、特定のクラス/メソッドが一致しませんでした。

呼び出してライブラリを構築しました

scons -j4 --dd --use-system-boost mongoclient.lib

また、SConstructスクリプトを変更しました。行を検索しますelif "win32" == os.sys.platform:。このセクションで私は追加しました

env.Append( EXTRACPPPATH=[ "C:/work/externals/boost_1_51_0" ] )

追加の「システム」フォルダを指定します。

また、ブーストバイナリライブラリの存在チェックを無効にする必要がありました。

    for b in boostLibs:
        l = "boost_" + b
        if not conf.CheckLib([ l + boostCompiler + "-mt" + boostVersion,
                               l + boostCompiler + boostVersion ], language='C++' ):
            Exit(1)

私のライブラリの名前は非常に異なっているからです。

もちろん、ブーストがMSVCライブラリで動的にコンパイルされる場合の状況はカバーしていません。

MongoチームまたはSconsをよく知っている人が、ビルドスクリプトを次のように変更することを願っています。

  • システムブーストライブラリへのパスを指定できるようにする
  • MSVC用のダイナミックリンクライブラリの構築を許可する
于 2012-10-31T18:45:29.913 に答える