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:library

我已将 nehe opengl 教程中的头文件 Texture.h 和 tga.h 包含到我的项目中。我有

#ifndef TGAISCOOL
#define TGAISCOOL
#endif

在我的 tga.h 文件中。如果我不止一次包含这个,我会从上面粘贴的链接器中得到错误。前两个来自 texture.h 虽然情况是一样的。

关于什么是错的任何想法?

4

4 回答 4

7

问题是您将定义而不是声明放在头文件中。

包含保护仅适用于单个翻译单元(即源文件)的多个包含。如果您编译多个翻译单元,每个翻译单元都会看到您的头文件的内容。

因此,不要将此定义放在头文件中:

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 文件。该头文件定义了四个对象,这意味着如果您将文件包含在不同的翻译单元中,这些符号将出现多次,这就是链接器所抱怨的。

解决方案是将这些对象的定义移动到 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 回答