세 파일이 있습니다. 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
를 선언하기 때문에
는 이름만큼이 같은 – lekroif
@lekroif 한, 어떤 문제가되지 않습니다 @mcalex : 사실, 당신이 필요한 경우 Sun CC와의 링크 및 재미있는 외부 템플릿 메커니즘을 사용하면 헤더에 선언 된 템플릿이있는 경우 헤더 및 구현에 대한 다른 기본 이름을 갖고 싶어합니다 (그렇지 않으면 템플릿을 사용할 때마다 구현 파일이 포함될 것입니다) . –
@Dietmar 필자는 일부 컴파일러가 이와 같이 동작 할 수 있다고 생각하여 헤더 myh.h의 이름을 지정한 이유입니다. 원래 연습에서 지침은 이름을 my.h (cpp 파일과 동일)라고했습니다. – lekroif