3

プロジェクトに次の行を追加した場合にのみ発生する、非常に奇妙なエラーメッセージが表示されます。

std::list<CRect> myVar;

std :: listである必要はなく、std::vectorまたは私が想定する他のSTLコンテナである可能性があることに注意してください。

エラーメッセージは次のとおりです。

エラー1エラーLNK2005: "public:__thiscall std :: list

:: list>(void) "(?? 0?$ list @ VCRect @@ V?$ allocator @ VCRect @@@ std @@@ std @@ QAE @ XZ)SomeLowLevelLibrary.libですでに定義されています

エラーメッセージで参照されている低レベルのライブラリは、私が構築しているプロジェクトについて何も知りません。コアの低レベルの機能しかなく、高レベルのMFCGUIを処理しません。

コード行を次のように変更すると、リンカーエラーが消える可能性があります。

std::list<CRect*> myVar;

しかし、私はそれのためにそれをハックしたくありません。

また、スタックとヒープのどちらに変数を作成しても、同じエラーが発生します。

誰かがこれについて何か考えを持っていますか?VistaEnterpriseでMicrosoftVisualStudio2008SP1を使用しています。

編集:上記のリンカーエラーはstd :: list <>コンストラクターの場合です。また、デストラクタ、_Nextnode、およびclear関数のエラーも発生します。

編集:プロジェクト内の他のファイルでは、std :: vectorはリンクしません。他のファイルでは、std::listである可能性があります。一部のコンテナが機能する理由と機能しない理由がわかりません。MFCリンケージは、両方のライブラリ間で静的です。低レベルのライブラリには、std::listから継承する1つのクラスがあります。

編集:低レベルライブラリにはCRectから継承するクラスはありませんが、STLを利用します。

4

6 に答える 6

2

リンカーの設定を見ているは​​ずですが、すぐにはわかりません。STL のインスタンス化が複数のファイルで行われるのは正常です。リンカーはいずれかを選択する必要があります。それらはすべて同一です (一貫したコンパイラ設定があると仮定します)

于 2008-09-30T14:18:48.773 に答える
1

私は最近、プロジェクトでこのエラーに再び遭遇し、前回のようにハック(std :: listをCArrayに交換)でパッチを適用するよりも徹底的な調査を行うことにしました。低レベルのライブラリの1つがstd::listから継承していたことがわかりました。

class LIB_EXPORT CRectList : public std::list<CRect>
{
};

これは悪い習慣であるだけでなく、メインアプリケーションのリンカーエラーの原因でもありました。CRectListを継承するのではなくstd::listをラップするように変更すると、エラーはなくなりました。

于 2009-10-23T10:32:41.353 に答える
0

ファイルは、2 つの別個のコード モジュールにコンパイルされる可能性のあるヘッダーに含まれていますか?

于 2008-09-30T14:25:51.177 に答える
0

これは正確な症状のようには聞こえませんが、メイン プロジェクトと含まれているすべてのライブラリが、[C++:コード生成] の下で同じ [ランタイム ライブラリ] 設定を使用していることを確認する必要があります。これらの設定を混在させると、ランタイム ライブラリ リンク エラーが発生する可能性があります。(あなたのケースで私を混乱させているのは、コードを変更することでそれを解消できるということですが、まだ確認していないかどうかを確認する価値があります。)

于 2008-09-29T14:26:16.097 に答える
0

今日、別のランダムな可能性が頭に浮かびました。現在の DLL と低レベル ライブラリが 2 つの異なるバージョンの MFC を参照している可能性はありますか? ロングショット。

于 2008-10-01T20:55:38.860 に答える
0

SomeLowLevelLibrary.lib には、CRect という名前のクラスが含まれているか、使用されていますか? STLを使用していますか?

于 2008-09-29T20:12:32.943 に答える