ブーストlibリンカーエラーVisual C ++
-
05-07-2019 - |
質問
Launchy のソースをダウンロードし、Visual Studio 2005でビルドしようとしています。LaunchyプロジェクトはVC7を使用して構築されたため、プロジェクトファイルをVC8に更新する必要があり、そのプロセスはうまくいったようです。ただし、Launchyは Boost 1.33.1ライブラリも使用しており、私が作成したのはBoost 1.41.0ライブラリ(最近のライブラリをはるかに簡単にビルドできるようにするためのBoostの小道具)、したがって、新しいBoostライブラリのインストールを指すようにプロジェクトを更新しました。これで、次のリンカーエラーが表示されます。
fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-sgd-1_41.lib'
Boost libディレクトリを見て、見つけられた最も近い一致は...
libboost_regex-vc80-mt-gd-1_41.lib
欠落している「s」に注意してください。ライブラリの違いはわかりません。VisualStudioが間違ったものを探しているのか、Boostビルドプロセスが適切なライブラリをビルドできなかったのかはわかりません。誰かが私を正しい方向に向けることができますか?
実験として、所有している正規表現ライブラリのコピーを作成し、リンカーが探しているものに名前を変更しました。これにより、次のようなmsvcrtd.libで既に定義されているシンボルに関するリンカエラーの長いリストが得られます。
error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in libcmtd.lib(typinfo.obj)
Boost 1.33.1 libsをビルドし、代わりにLaunchyプロジェクトファイルを指すようにします。ただし、Boost 1.41.0ライブラリの何が問題なのかを知りたいです。
編集: Boostドキュメントで、「s」ライブラリについて:
C ++標準ライブラリおよびコンパイラランタイムサポートライブラリに静的にリンクする場合は、このライブラリを使用します。
つまり、 's'ライブラリが正しいようです。今、私はそれらを構築する方法を理解する必要があります。
ソリューション:次のコマンドラインを使用して、不足しているブーストライブラリを構築できました。
bjam --build-type=complete msvc stage
boostrap.batをboostが存在するディレクトリで既に実行した後に実行しました。
解決
違いは Boost docsで明確に説明されています-" mt-sgd"は、「デバッグ、静的にリンクされたランタイムライブラリ、マルチスレッド、デバッグシンボル」を意味します。 " mt-gd"同じですが、動的にリンクされたランタイムライブラリ(つまり、libcmtd.libの代わりにmsvcrtd.lib)を使用します。
動的CRTリンクを使用するようにプロジェクト設定を変更する(つまり、/ MTdの代わりに/ MDd)か、静的リンクを使用してBoostをビルドします-それらを混合すると正しく動作しません。
他のヒント
ブーストの作成に使用したコマンドは何ですか? build-type = completeを指定してみてください。通常は、sライブラリもビルドする必要があります。