2

いくつかの静的ライブラリ (作成したものと作成していないもの) に依存する Windows 実行可能ファイルをリンクしようとしています。リンクを実行すると、次のような一連のエラーが表示されます。

LIBCMT.lib(mlock.obj) : error LNK2005: _unlock already defined in MSVCRT.lib(MSVCR100.dll)

これは、古典的な /MD 対 /MT の問題です (C ランタイムが静的にリンクされているか動的にリンクされているか)。最初に簡単な解決策を試し、リンカーフラグを追加しました

/nodefaultlib:libcmt /nodefaultlib:libcpmt

しかし、それは異なるエラーを引き起こしました:

msvcprt.lib(MSVCP100.dll) : error LNK2005: "public: __cdecl std::_Locinfo::~_Locinfo(void)" (??1_Locinfo@std@@QEAA@XZ) already defined in gtest.lib(gtest-all.cc.obj)
gtest.lib(gtest-all.cc.obj) : error LNK2001: unresolved external symbol "private: static int std::locale::id::_Id_cnt" (?_Id_cnt@id@locale@std@@0HA)

私が構築しているライブラリを調べましたが、私が知る限り、それらはすべて /MD を構築しています。「私が知る限り」と言うのは、それらのいくつかは独自のメイクファイルが付属するサードパーティのライブラリであるため、ビルドプロセスを完全に制御できない..

ライブラリ(EXEとDLLのみ)で「依存」が機能するとは思わない、リンクしているさまざまなライブラリを見て、必要なときにどれがlibcmtに取り込まれているかを確認できるツールはありますか代わりに msvcrt を使用していますか?

4

1 に答える 1

3

私は同じ問題を抱えていて、ライブラリの /DIRECTIVES オプションを指定して dumpbin ( http://msdn.microsoft.com/en-us/library/z66yd3h6.aspx ) を使用しました。多数の /DEFAULTLIB セクションが表示されます。それぞれが、lib が使用しようとする別の lib です。Dumpbin は、Visual Studio コマンド プロンプトから実行する必要があります。

dumpbin /DIRECTIVES liblua52.lib

私はすべてのソリューション構成とプラットフォームを備えた 100 以上のライブラリを持っていたので、それを行うために Python 2.7 スクリプト (crtdisplay.py) を作成しました。私の bitbucket リポジトリ ( https://bitbucket.org/vimarina/ctrlcv/src/57b7ddca15b5c7fefddcf20ffcea0633223a4bd6/crtdisplay )にあります。ライブラリのルート ディレクトリに配置します。そのコードではあまりエラーチェックが行われないので、失敗しても驚かないでください:)。Visual Studio 2010 を使用したため、他のバージョンの Visual Studio では失敗する可能性があります。

 crtdisplay.py > info.txt
于 2014-03-17T22:39:48.410 に答える