1

エンジンのコアに取り組んでいますが、Microsoft Visual C++ Express で重大なリンクの問題が発生しています。

簡単に言うと、問題の原因はこれら 2 つのヘッダー ファイルであり、各ヘッダー ファイルには異なる識別子を持つ名前空間があります。これらの両方のインクルード ファイルは、実際には相互にインクルードします。コンパイルではエラーは発生しませんが、リンクすると、「X already defined in A.obj」というエラーが表示されます。以下に例を示します。

ヘッダー 1

#ifndef HEADER1_H
#define HEADER1_H

#include "header2.h"
namespace Core{
    int x, y, z;
}
#endif

ヘッダー 2

#ifndef HEADER2_H
#define HEADER2_H

#include "header1.h"
namespace GUI{
    int x, y, z;
}
#endif

結局、作成された最初の .obj ファイルで x、y、および z 変数が既に定義されているというエラーが表示されます。変数は異なる名前空間からのものであるため、衝突できないと思いました。ヘッダーガードも持っているので、ヘッダーファイルが複数回含まれているようには見えません。

とにかく、どんな種類の助けやアドバイスも大歓迎です。私はこれで約3日間立ち往生しています:P. また、十分な情報を提供していない場合はお知らせください。現在のコードが非常に長いというだけです。

乾杯、ジョーイ

4

2 に答える 2

9

実際、問題は変数がヘッダー ファイルで定義されていることです。ヘッダー ファイルに含まれているのではなく、ヘッダーを含む各 .cpp ファイルで、6 つの変数すべてが定義されています。

各 .cpp ファイルは .o ファイルに変換され、各 .o は最終的に変数が定義された状態になり、リンカー エラーが発生します。あなたがしたいのは、ヘッダーで extern キーワードを使用することです。これにより、実際の変数が他の場所で定義されていることをコンパイラに伝えます...

例えば:

namespace Core{
    extern int x, y, z;
}

namespace GUI{
    extern int x, y, z;
}

次に、cpp ファイル (1 つの cpp ファイルのみで!)で、externなしで変数を定義する必要があります。

namespace Core {
    int x, y, z;
}
namespace GUI{
    int x, y, z;
}

これにより、リンカーのエラーが修正されます。

于 2012-04-05T00:41:54.443 に答える
1

問題は、複数の名前空間に同じ変数名を含めていることではなく、単に変数を宣言するのではなく、ヘッダーで変数を定義していることです。これにより、コンパイラはヘッダーを含むコンパイル単位ごとにこれらの変数のコピーを 1 つ作成し、リンク時にこれらの競合が発生するため、エラーが発生します。

extern を使用して、それらを定義するのではなく、ヘッダーで宣言するだけです。

ヘッダー 1

#ifndef HEADER1_H
#define HEADER1_H

#include "header2.h"
namespace Core{
    extern int x, y, z;
}
#endif

ヘッダー 2

#ifndef HEADER2_H
#define HEADER2_H

#include "header1.h"
namespace GUI{
    extern int x, y, z;
}
#endif

そして、.cpp2 つのヘッダーのそれぞれのファイルにnamespace Core { int x, y, z; }namespace GUI{ int x, y, z; }

于 2012-04-05T00:39:05.010 に答える