2

以前の質問と同じように見えますが、この近いシナリオを観察してください。それでも私は答えを得ていません。したがって、重複として報告しないでください。

10 個の依存関係を持つプロジェクトがあります。最初に、メイン プロジェクトの C/C++ コード生成セクションで /MTD オプションを使用してコンパイルし、そのすべての依存関係が正常にビルドされました。

次に、オプションを /MTD から /MDd に変更すると、すべての依存プロジェクトが正常にビルドされます。ただし、メイン プロジェクトでは、次のエラーが報告されます。


LIBCMTD.lib(osfinfo.obj) : error LNK2005: __open_osfhandle already defined in MSVCRTD.lib(MSVCR80D.dll)

LIBCMTD.lib(lseeki64.obj) : error LNK2005: __lseeki64 already defined in MSVCRTD.lib(MSVCR80D.dll)


sqlite3x.lib(sqlite3x_command.obj) : error LNK2005: "protected: wchar_t * __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::_Myptr(void)" (?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEPA_WXZ) already defined in msvcprtd.lib(MSVCP80D.dll)

MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __mkdir already defined in LIBCMTD.lib(mkdir.obj)

MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __strdup already defined in
LIBCMTD.lib(strdup.obj)

   Creating library Debug/Application.lib and object Debug/Application.exp
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library

LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library

どうすればこれを修正できますか?

4

3 に答える 3

5

C ランタイム ライブラリを混在させることはできません。ライブラリまたはオブジェクトをコンパイルした /MT(anything) がある場合、単に /MD とリンクすることはできません。スレッドセーフな MSVCRT とリンクする必要があります。if's and's or but's はありません。C ランタイムを混在させることはできません。スレッド化を行わないプログラムであっても、/MT を使用するのが最善だといつも思っています。

プロジェクトのクリーン操作を実行して、ビルド済みのオブジェクトとライブラリを削除しましたか? ここでも SQLite に依存していますが、それも再構築しましたか?

于 2009-06-01T15:03:35.410 に答える
1

一連の静的 C++ ライブラリがすべて一緒にリンクされている場合、すべてに /MTD が必要であるか、すべてに /MDd が必要です。/MTD を含むプロジェクトを /MDd を含む別のプロジェクトにリンクすることはできません。

これがおそらくリンク エラーの原因です。メイン プロジェクトでのみ取得している理由は、実際にリンクを行うのはメイン プロジェクトだけだからです。問題が解決したかどうか教えてください。

/MTD と /MDd で同じ問題が発生し、非常によく似たエラーが発生したことを思い出します。

于 2009-06-01T15:06:30.550 に答える
0

ここでの私の回答は、この問題の私のバージョンを解決するのに非常に役立つとわかったいくつかの MSDN 記事へのリンクです。

于 2010-02-09T00:52:39.493 に答える