4

#ifndef と #define を使用していないことを示唆するリンカー エラーが表示されます。

1>TGALoader.obj : エラー LNK2005: "struct TGA tga" (?tga@@3UTGA@@A) は既に main.obj で定義されています 1>TGALoader.obj : エラー LNK2005: "struct TGAHeader tgaheader" (?tgaheader@@3UTGAHeader @@A) main.obj で既に定義されている 1>TGALoader.obj : エラー LNK2005: "unsigned char * uTGAcompare" (?uTGAcompare@@3PAEA) main.obj で既に定義されている 1>TGALoader.obj : エラー LNK2005: "unsigned char * cTGAcompare" (?cTGAcompare@@3PAEA) は main.obj で既に定義されています 1>LINK : 警告 LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合します。/NODEFAULTLIB:ライブラリを使用

nehe opengl チュートリアルのヘッダー ファイル Texture.h と tga.h をプロジェクトに含めました。私は持っている

#ifndef TGAISCOOL
#define TGAISCOOL
#endif

私の tga.h ファイルで。これを複数回含めると、上で貼り付けたリンカーからエラーが発生します。最初の 2 つは texture.h からのものですが、状況は同じです。

何が間違っているかについてのアイデアはありますか?

4

4 に答える 4

7

問題は、宣言の代わりにヘッダー ファイルに定義を入れていることです。

インクルード ガードは、1 つの翻訳単位 (つまり、ソース ファイル) の複数のインクルードに対してのみ機能します。複数の翻訳単位をコンパイルすると、それぞれにヘッダー ファイルの内容が表示されます。

したがって、この定義をヘッダー ファイルに入れる代わりに、次のようにします。

struct TGA tga;

この宣言をヘッダー ファイルに入れたいとします。

/* whatever.h */
extern struct TGA tga;

次に、ソース ファイルに定義を追加します。

/* whatever.c */
#include "whatever.h"

struct TGA ta;

原則として、定義はソース ファイルに、宣言はヘッダー ファイルに記述します。

于 2010-01-24T00:19:51.160 に答える
7

あなたは何も悪いことをしていません。問題は、NeHe から入手した Tga.h ファイルにあります。このヘッダー ファイルは 4 つのオブジェクトを定義します。つまり、ファイルを異なる翻訳単位にインクルードすると、これらのシンボルが複数回表示され、それがリンカの不満です。

解決策は、これらのオブジェクトの定義を Tga.cpp ファイルに移動することです。

以前に定義されていた Tga.h の行は、次のようになります。

extern TGAHeader tgaheader;
extern TGA tga;

extern GLubyte uTGAcompare[12];
extern GLubyte cTGAcompare[12];

これらの行の元のバージョンは現在 Tga.cpp にあります

于 2010-01-24T00:20:23.510 に答える
3

#ifndef が正しく機能していないと結論付ける理由はありません。エラー メッセージは、複数の翻訳単位 (.obj ファイル) で同じ名前の項目が定義されていることを示しています。したがって、リンク プロセスは失敗しています。

修正方法については、さらにコードを確認する必要があります。

于 2010-01-23T23:41:35.027 に答える
2

Tga.H を次のように変更します。

#ifndef Tga_H
#define Tga_H
#include "Texture.h"



struct TGAHeader
{
    GLubyte Header[12];                                 // TGA File Header
} ;


struct TGA
{
    GLubyte     header[6];                              // First 6 Useful Bytes From The Header
    GLuint      bytesPerPixel;                          // Holds Number Of Bytes Per Pixel Used In The TGA File
    GLuint      imageSize;                              // Used To Store The Image Size When Setting Aside Ram
    GLuint      temp;                                   // Temporary Variable
    GLuint      type;   
    GLuint      Height;                                 //Height of Image
    GLuint      Width;                                  //Width ofImage
    GLuint      Bpp;                                    // Bits Per Pixel
} ;


extern  TGAHeader tgaheader;                                    // TGA header
extern  TGA tga;                                                // TGA image data



extern GLubyte uTGAcompare[12]; // Uncompressed TGA Header
extern GLubyte cTGAcompare[12]; // Compressed TGA Header
bool LoadTGA(Texture * , char * );
bool LoadUncompressedTGA(Texture *, char *, FILE *);    // Load an Uncompressed file
bool LoadCompressedTGA(Texture *, char *, FILE *);      // Load a Compressed file

#endif

TGALoader.cpp ファイルの先頭に次の行を追加します。

TGAHeader tgaheader;
TGA tga;
GLubyte uTGAcompare[12] = {0,0,2, 0,0,0,0,0,0,0,0,0};
GLubyte cTGAcompare[12] = {0,0,10,0,0,0,0,0,0,0,0,0};
于 2010-08-28T18:33:18.130 に答える