0

Visual C++ 2012 を使用して x64 C++ DLL をビルドしようとしました。これは、他の 1 つの静的サードパーティ .lib ファイルをリンクする単純な DLL です。次の警告メッセージが表示されます。

警告 LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合します。/NODEFAULTLIB:ライブラリを使用

私のDLL(および私のDLLをインポートする他のすべてのプロジェクト)が/ MD(マルチスレッドDLLランタイム)を使用している間、他のライブラリは/ MT(マルチスレッド静的ランタイム)リンカーオプションを使用しているようです。サードパーティのライブラリがそのまま提供され、DLL を変更すると、DLL を使用するすべてのプロジェクトで同じ問題が発生するため、これを調和させることはできません。

この問題について、MS とフォーラムからいくつかのページを読みました。しかし、これらのページのどれも、ここでの問題を正確に説明していません。

私が理解していないこと:

異なるランタイム バリアントを使用するコードをリンクすることの害は何ですか (メモリの浪費以外)? これは無視できると言う人もいれば、無視できないかもしれないと言う人もいます。

/NODEFAULTLIB[:library] を使用してもよろしいですか? ドキュメントには、「外部参照を解決するときに検索するライブラリのリストから、指定されたライブラリまたはライブラリを削除する」と記載されています。どのライブラリを「:library」として追加する必要があり、これによりどのように問題が解決されますか?

4

2 に答える 2

3

C ランタイム オブジェクト (FILE* などのアイテム) を共有している場合、またはメモリ割り当てを共有している場合 (ある部分でメモリを割り当て、別の部分でメモリの割り当てを解除する)、競合するランタイム ライブラリは重大な問題を引き起こす可能性があります。奇妙な問題やクラッシュを避けるために、それらを「強制」することは避けます。

代わりに、lib または dll のビルドを変更できない場合は、C ランタイム オブジェクトをリークしたり、dll の外部でメモリを解放する必要がない C のみのインターフェイスを使用して、lib を dll 内にラップします。内に作成されます。

于 2013-10-31T16:54:49.620 に答える