2010-01-23 5 views
3

#ifndef 및 #define을 사용하지 않는 것이 좋습니다 링커 오류가 발생합니다.#ifndef를 사용하여 링커 오류가 발생하더라도 링커 오류가 발생합니다.

1> TGALoader.obj : 오류 LNK2005 : "구조체 TGA TGA" 이미 main.obj 정의 1> TGALoader.obj (TGA @@ 3UTGA @@?) : 오류 LNK2005 : " tgaheader 구조체 tGAHeader " 이미 main.obj 정의 1> TGALoader.obj (tgaheader @@ 3UTGAHeader @@?) 오류 LNK2005"부호 * CHAR는 가 uTGAcompare "(? uTGAcompare @@ 3PAEA) 이미 정의 main.obj > TGALoader.obj : 오류 LNK2005 : "부호없는 char * cTGAcompare" (? cTGAcompare @@ 3PAEA) 이미 정의 됨 main.obj 1> LINK : 경고 LNK4098 : defaultlib 'LIBCMTD'와 (과) 충돌 다른 라이브러리 사용; 내 프로젝트에 라이브러리 나는 nehe는 OpenGL 튜토리얼에서 헤더 파일 Texture.h 및 tga.h을 포함했다

: /NODEFAULTLIB를 사용합니다. 나는 내 tga.h 파일에

#ifndef TGAISCOOL 
#define TGAISCOOL 
#endif 

을 가지고있다. 이것을 두 번 이상 포함하면 위의 붙여 넣은 링커에서 오류가 발생합니다. 처음 두 가지는 texture.h에서 왔지만 상황은 동일합니다.

무엇이 잘못 되었습니까?

+1

더 많은 코드를 표시하십시오. – SoapBox

+0

링커 오류는'# ifndef'와 아무 관련이 없습니다. 헤더 가드는 컴파일 타임 (즉, 변환 단위당)에서 재 정의 충돌을 방지합니다. 이 문제는 완전히 다릅니다! –

답변

6

아무런 잘못하지 않았습니다. 문제는 NeHe의 Tga.h 파일입니다. 이 헤더 파일은 네 개의 객체를 정의합니다. 즉, 파일을 다른 번역 단위로 포함하면 이러한 심볼이 여러 번 나타나고 링커가 불만을 제기하는 것입니다.

해결 방법은 이러한 개체의 정의를 Tga.cpp 파일로 옮기는 것입니다.

이전에 정의가 지금과 같이 Tga.cpp

지금이 라인의 원래 버전으로 Tga.H을
3

#ifndef가 제대로 작동하지 않는다고 결론 지을 이유가 없습니다. 오류 메시지가 말한 것은 여러 개의 번역 단위 (.obj 파일)에 같은 이름의 항목이 정의되어 있다는 것입니다. 따라서 링크 프로세스가 실패합니다.

수정 방법은 더 많은 코드가 필요합니다.

+0

이 요청을 처리하는 방법에 대해 궁금합니다. 붙여 넣을 코드가 많습니다. 무엇을 정확히 포함시켜야합니까? 전체 솔루션을 압축 할 수있는 공간이 있습니까? – bobber205

+1

@ bobber205 : http://gist.github.com/은 물건을 공유하는 쉬운 방법 일뿐만 아니라 최소한의 재현 가능한 테스트 케이스까지 줄여야합니다. 다시 말해, 실패를 시연하면서 가능한 모든 것을 제거하십시오. – ephemient

7

문제는 선언 대신 헤더 파일에 정의를 넣는 것입니다.

포함 가드는 단일 번역 단위 (예 : 소스 파일)의 여러 포함에 대해서만 작동합니다. 여러 번역 단위를 컴파일하면 각 번역 단위에 헤더 파일의 내용이 표시됩니다.

그래서, 대신 헤더 파일에이 정의 퍼팅의 :

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

을 그리고 정의를 추가

struct TGA tga; 

당신은 당신의 헤더 파일이 선언을 데려 가고 싶다는 소스 파일에서 :

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

struct TGA ta; 

어림짐작은 소스 파일에 정의가 들어가고 선언이 헤더 파일에 들어간다는 것입니다.

+0

정적/인라인 정의는 헤더 파일에서 잘됩니다. 문제가 발생하는 여러 번역 단위에 외부에서 보이는 언어가 있습니다. – ephemient

+0

@ephemient - 필자는 인라인 정의에서이 점을 분명히 인정합니다. 그러나 정적 정의가 기술적으로 헤더 파일에서 제대로 작동하지만 필자는 언급 할 가치가없는 끔찍한 스타일이라고 생각합니다. –

+0

"좋은 취향"이 아니라 "작품"에서와 같이 "괜찮음"을 의미했습니다. – ephemient

2

extern TGAHeader tgaheader; 
extern TGA tga; 

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

을 변경 읽어야했다 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}; 
관련 문제