0

そこで、VC++ 8.0 の演習として小さな 3D エンジンを構築しようとしています。TestBed exe によってリンクされている MathLib 静的ライブラリと Render 静的ライブラリがあります。現在、Render には、Color と DXManager3D の 2 つのクラスがあります。Color には、MathLib の Vector.h が含まれていますが、問題ありません。

2 番目に DXManager3D に Vector.h をインクルードしようとすると、シンボルが 2 回定義されており、2 番目の定義が無視されると言って爆発します (lib からの警告)。テストとして、Color.h から Vector.h を削除し、DXManager3D.h に残しました - 同じ問題です。これを防ぐために、すべてが ifndef にラップされていることを確認するためにトリプルチェックを行ったので、頭を悩ませています。

DXManager3D.obj : 警告 LNK4006: "public: __thiscall Math::Vector::Vector(void)" (??0Vector@Math@@QAE@XZ) は Render.obj で既に定義されています。2 番目の定義は無視されます

本当に混乱するのは、Render.lib を TestBed とは別にビルドするときに、これは静的な lib であるため、何もリンクしてはならないということですよね? 複数のシンボル定義の警告が引き続き表示されます。メインで DXManager3D をインスタンス化すると、警告がエラーになります。

Render.lib(DXManager3D.obj): エラー LNK2005: "public: __thiscall Math::Vector::Vector(void)" (??0Vector@Math@@QAE@XZ) は既に WinMain.obj で定義されています

はい、LNK4006 と LNK2005 を F1 しましたが、MSDN の解決策がうまくいきません。この質問が以前に尋ねられた場合は申し訳ありませんが、検索機能を使用するのに役立つ確かなものが見つかりませんでした.

ありがとう!

4

2 に答える 2

2

あなたのVectorctorは、クラス定義の外のヘッダーで定義されていますか? インラインにしてから、つまり変更します

class Vector {
  public:
    Vector();
  // ...
}; 

Vector::Vector() {
   // ...
}

class Vector {
  public:
  Vector() {}
  // ...
}; 

または明示的なinline修飾を使用します。

class Vector {
   public:
  Vector();
  // ...
}; 

inline Vector::Vector() {
   // ...
}
于 2009-04-04T19:19:39.827 に答える
1

ベクター クラスにリンケージの問題があるようです。あなたの情報に基づいて、クラスはヘッダーファイルを含むライブラリにリンクされているようです。これは内部リンケージであり、外部リンケージが本当に必要です。

Vector.h の内容、または少なくとも Vector() コンストラクターを投稿できますか? これにより、実際に何が起こっているかの手がかりが得られるはずです。

リンク: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr020.htm

編集

あなたのコメントに基づいて、クラス ライブラリの外部のヘッダー ファイルですべての関数を宣言したようです。それらをヘッダー以外のファイル (たとえば、Vector.cpp ファイル) に配置する必要があります。

これにより、プログラムに適切なリンケージが与えられ、Vector.h を両方のプログラムに含めることができます。

于 2009-04-04T19:17:27.820 に答える