ストレンジMFC / VC ++リンカーエラー(std :: list< CRect>はすでに定義されています)
-
02-07-2019 - |
質問
プロジェクトに次の行を追加したときにのみ発生する非常に奇妙なエラーメッセージがあります。
std::list<CRect> myVar;
これはstd :: listである必要はなく、std :: vectorまたは他のSTLコンテナである可能性があることに注意してください。
エラーメッセージは次のとおりです。
エラー1エラーLNK2005:&quot; public: __thiscall std :: list
:: list&gt;(void)&quot; (?? 0?$ list @ VCRect @@ V?$ allocator @ VCRect @@@ std @@@ std @@ QAE @ XZ) ですでに定義されています SomeLowLevelLibrary.lib
エラーメッセージで参照されている低レベルライブラリは、私が構築しているプロジェクトについてはわかりません。コアの低レベル機能しかなく、高レベルMFC GUIを処理しません。
コードの行を次のように変更すると、リンカーエラーが消えます:
std::list<CRect*> myVar;
しかし、私はそれのためにそれをハックしたくありません。
また、スタック上に変数を作成してもヒープ上に変数を作成しても、同じエラーが発生します。
これについて何かアイデアはありますか? Vista EnterpriseでMicrosoft Visual Studio 2008 SP1を使用しています。
編集:上記のリンカーエラーは、std :: list&lt;&gt;に対するものです。コンストラクタ、デストラクタ、_Nextnode、およびクリア関数のエラーも取得します。
編集:プロジェクト内の他のファイルでは、std :: vectorはリンクしませんが、他のファイルではstd :: listになります。いくつかのコンテナが機能する理由と、そうでないコンテナが存在する理由はわかりません。 MFCリンケージは両方のライブラリで静的です。低レベルのライブラリには、std :: listを継承する1つのクラスがあります。
編集:低レベルライブラリにはCRectを継承するクラスはありませんが、STLを使用します。
解決 2
最近、私たちのプロジェクトでこのエラーに再び出くわし、前回のようなハックでパッチを当てるよりも徹底的な調査を行うことにしました(CArrayのstd :: listを交換)。低レベルのライブラリの1つがstd :: listを継承していることがわかりました。例:
class LIB_EXPORT CRectList : public std::list<CRect>
{
};
これは単なる悪い習慣ではありませんが、メインアプリケーションのリンカーエラーの原因でもありました。 CRectListを継承するのではなくstd :: listをラップするように変更すると、エラーはなくなりました。
他のヒント
リンカの設定を確認する必要がありますが、すぐにそれを言うことはできません。 STLのインスタンス化が複数のファイルで行われるのは正常です。リンカーは1つを選択する必要があります。それらはすべて同一です(コンパイラー設定が一貫していると仮定します)。
これは正確な症状のようには聞こえませんが、メインプロジェクトと含まれているすべてのライブラリが同じ「ランタイムライブラリ」を使用していることを確認する必要があります。 「C ++:Code Generation」の下の設定。これらの設定を混合すると、ランタイムライブラリリンクエラーが発生する可能性があります。 (あなたのケースで私を混乱させるのは、コードを変更することでそれをなくすことができるということですが、まだ行っていない場合は確認する価値があります。)
SomeLowLevelLibrary.libにはCRectという名前のクラスが含まれていますか、または使用されていますか? STLを使用しますか?
ファイルは、2つの別個のコードモジュールにコンパイルされる可能性のあるヘッダーに含まれていますか?
今日、別のランダムな可能性が私の頭に浮かびました。現在のDLLと低レベルライブラリがMFCの2つの異なるバージョンを参照している可能性はありますか?ロングショット。