3

私はこの質問をしてから、自分で答えます。私は、それが初心者の質問であることを認識していますが、それは私に約かかりました。正解を見つけるのに2日かかりますが、とにかく投稿します。

免責事項は以上です。これは、すべての初心者に捧げられています。

私は VS 2010 で MFC プロジェクトに参加しましたが、サードパーティの静的ライブラリを追加する必要がありました。すべてがうまくいき、両方のプロジェクトがコンパイルされ、私のプロジェクトがライブラリを参照することができました。次に、ライブラリのヘッダー ファイルをプロジェクトにインクルードすると、C ランタイム ライブラリの関数に関する多くのリンカー警告が表示されました。

警告 9 警告 LNK4006: _sprintf は既に libcmtd.lib(sprintf.obj) で定義されています。2 番目の定義は無視されます C:path\to\my\project\MSVCRTD.lib(MSVCR100D.dll)

「なんてこった」と考えて、プロジェクトを実行しようとしましたが、「fostream」を使用してファイルに書き込もうとするコード行に遭遇するまで実行され、恐ろしいヒープ破損例外でクラッシュしました。

SOを検索すると、関連する問題がいくつか見つかりましたが、どれも私の問題と正確には一致しません:

答えに出くわす前に、外部ライブラリをdllでほぼラップしました。

4

1 に答える 1

5

私のハッピーエンドは、マイクロソフトのサポート記事で正しい答えに出くわしたことです: How to link with the correct C Run-Time (CRT) library

どうやら、記事に記載されているように、次の規則に違反したようです。

再利用可能なライブラリとそのすべてのユーザーは、同じ CRT ライブラリ タイプを使用する必要があるため、同じコンパイラ スイッチを使用する必要があります。

つまり、プロジェクトとサードパーティ ライブラリの両方に同じ C ランタイム (CRT) ライブラリを使用する必要があったということです。VS 2010 で CRT を選択するには、project_name を右クリック --> プロパティ (プロパティ ウィンドウが開きます) --> C/C++ --> コード生成 --> ランタイム ライブラリを選択します。記事の表に従って、プルダウン リストを使用してランタイム ライブラリを選択します (シングルスレッド、静的マルチスレッドまたは dll マルチスレッド、リリースまたはデバッグ)。

すべてのプロジェクトを構成した後、それらを再コンパイルすると、(うまくいけば) 警告がなくなります。

于 2010-11-21T07:07:16.117 に答える