2012-12-30 2 views
2

세 파일이 있습니다. myh.h; my.cpp; use.cpp. 다음은 파일의 내용은 다음과 같습니다C++ : GCC 컴파일러와 파일 연결

myh.h

extern int foo; 
void print_foo(); 
void print(int); 

my.cpp

#include "myh.h" 
#include <iostream> 
void print_foo() 
{ 
    std::cout<<foo<<std::endl; 
} 
void print(int i) 
{ 
    std::cout<<i<<std::endl; 
} 

use.cpp

#include "myh.h" 
int main() 
{ 
    foo=7; 
    print_foo(); 
    print(99); 
    return 0; 
} 

GCC 다음 오류를 발생시킵니다.

my.o:my.cpp:(.text+0x7): undefined reference to `foo' 
use.o:use.cpp:(.text+0x10): undefined reference to `foo' 
collect2: ld returned 1 exit status 

-c 명령을 사용하여 파일을 컴파일하는데 오류가 발생하지 않습니다. 이것이입니다 호기심에 대한

..... 문제가 여기에 무엇

g++ -o final my.o use.o 

, 나는 비슷한 문제를 가진 다른 주제를 읽고, 여기 경우는 이상하다 : 나는 다음과 같은 명령을 사용하여 링크하는 C++

편집을 사용 스트로브 스트 룹의 책 프로그래밍 원리에서 운동을 드릴 : dasblinkenlight 말했듯이 내가했고, use.cpp에서 나는 (이제 foo는이 정의) foo는 앞에 int를 추가,하지만 난 아직이 얻을 오류 :

my.o:my.cpp:(.text+0x7): undefined reference to `foo' 
collect2: ld returned 1 exit status 

이는 my.cpp에도 정의되어 있지 않다는 것을 알려줍니다. 어디에서나 정의해야한다면 헤더 파일에 포함시키는 것이 무엇인가? 아니면 더 적절하게 접근해야 하는가? 당신 foo를 선언하기 때문에

+0

는 이름만큼이 같은 – lekroif

+0

@lekroif 한, 어떤 문제가되지 않습니다 @mcalex : 사실, 당신이 필요한 경우 Sun CC와의 링크 및 재미있는 외부 템플릿 메커니즘을 사용하면 헤더에 선언 된 템플릿이있는 경우 헤더 및 구현에 대한 다른 기본 이름을 갖고 싶어합니다 (그렇지 않으면 템플릿을 사용할 때마다 구현 파일이 포함될 것입니다) . –

+0

@Dietmar 필자는 일부 컴파일러가 이와 같이 동작 할 수 있다고 생각하여 헤더 myh.h의 이름을 지정한 이유입니다. 원래 연습에서 지침은 이름을 my.h (cpp 파일과 동일)라고했습니다. – lekroif

답변

8

당신은 링커 오류,하지만 당신은 그것을을 정의하지 .

extern int foo은 단지 선언입니다. foo 변수에 대한 메모리 할당이 발생하지 않으며 다른 장소에서 수행 할 것이라고 약속합니다. 이 문제를 해결하려면, 당신은이처럼 CPP 파일 중 하나에이 줄을 추가해야합니다

#include "myh.h" 
int foo; 
int main() 
{ 
    foo=7; 
    print_foo(); 
    print(99); 
    return 0; 
} 
+0

좋아, 논리, 나는 그것 앞에 "int"를 추가하여 use.cpp에 foo를 정의했다. 하나의 오류가 적지 만 여전히 링크 오류가 있습니다. my.o : my.cpp :(.텍스트 + 0x7) : 'foo'에 대한 정의되지 않은 참조 collect2 : ld가 1 종료 상태를 반환했습니다. 왜? 만약 내가 모든 파일에서 그것을 정의한다면, 그때 그것을 포함하는 것이 무엇인지 ... – lekroif

+0

@lekroif 나는'foo'를 정의하는 위치를 보여주기 위해 그 대답을 편집했다 (그것은 전역, 즉 가장 바깥 쪽 범위에 있어야한다). 나는 이것을 로컬에서 시도했는데 모든 것이 잘 동작했다. – dasblinkenlight

+0

예, 감사합니다. 나는 혼란의 근원을 파악하기 위해 더 많은 독서를 할 것입니다. – lekroif

3

문제는 foo가 선언되었지만 정의되지 않는 것입니다. 당신은 번역 단위의 정확히 하나의 foo을 정의하는 예를 필요

int foo = 0; 
관련 문제