2

プロジェクトの名前を変更するために長いプロセスを経た後、私の DLL プロジェクトはデバッグ モードでビルドされません (リリース ビルドは機能します)。

MSVCRTD.lib(msvcr90d.dll) : error LNK2005: _CrtDbgReportW already defined in LIBCMTD.lib(dbgrpt.obj)

このプロジェクトと、それが依存する 5 つのスタティック ライブラリは、「マルチスレッド デバッグ (/MTd)」(C/C++|コード生成|ランタイム ライブラリの下) を使用するように設定されています。LIBCMTD.lib はマルチスレッド デバッグ用のものだと思いますが、MSVCRTD.lib とは何ですか? このエラーの原因は何ですか?

違いがある場合、この DLL は Windows CE 用です。

4

4 に答える 4

5

LIBCMT は /MT に必要なもので、MSVCRT は /MD に必要なものです。混合された .obj ファイルと .lib ファイルをリンクしています。一部は /MT でコンパイルされ、一部は /MD でコンパイルされています。それは良いことではありません。

通常、問題の原因は .lib ファイルです。ビルド設定を確認し、/M オプションが DLL プロジェクトと同じであることを確認してください。

また、DLL が /MT でコンパイルされた場合に発生する可能性のある問題にも注意してください。クライアントが解放する必要があるオブジェクトへのポインターを DLL が返す場合、大きな問題が発生します。できません。同じメモリ アロケータを使用していません。

于 2010-01-18T19:30:47.363 に答える
1

LNK4098に関する MSDN の記事には、非常に便利な表があります。使用している CRT に応じて、「特定のライブラリを無視する」リストに手動で追加するライブラリが示されています。あなたの場合、これらすべてを無視する必要があります。

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

報告されたライブラリもこのリストに含まれていることを確認してください。この問題は、 KB154753で詳しく説明されています ... Visual C++ を使用してビルドされたときにプログラムがリンクされるライブラリ

これについての私の解釈は、特定の状況では、コードをリンクする CRT ライブラリを自動的に選択するアルゴリズムが、いくつかの競合するライブラリを選択するということです。

于 2010-02-09T00:48:06.403 に答える
0

リリースセットとは?DLL をマルチスレッド デバッグに設定すると、DLL にアクセスする何かが解放しようとするメモリを割り当てると、問題が発生する可能性があります (たとえば、異なるヒープに割り当てられます)。マルチスレッド デバッグ DLL を設定してみてください。

リンク先のライブラリがマルチスレッド デバッグ DLL を予期しているため、リンクの問題が発生する可能性があります。そのため、リンカーは両方をリンクしようとし、リンクは失敗します ...

于 2010-01-18T19:31:08.107 に答える