我制作了一个程序来测试我在课堂上的知识,但是我遇到了一些麻烦。
foo.h中:
#include <iostream>
using namespace std;
class foo
{
private:
int a;
public:
foo();
};
foo.cc:
#include <iostream>
#include "foo.h"
using namespace std;
foo::foo()
{
a = 0;
}
和main.cc:
#include<iostream>
#include "foo.h"
int main()
{
foo a;
return 0;
}
我用g ++ main.cc -o main编译了这个。然后我得到了
-bash-4.1$ g++ main.cc -o main
/tmp/cc5Hnes8.o: In function `main':
main.cc:(.text+0x10): undefined reference to `foo::foo()'
collect2: ld returned 1 exit status
我认为这里应该有一个非常愚蠢的错误,但我真的找不到它。我这整个晚上都在挣扎......
感谢任何帮助!
答案 0 :(得分:3)
您要求编译器不仅要翻译main.cc
,还要执行最终链接以生成可执行文件main
。第二步无法完成,因为main.cc
引用了foo::foo
的函数foo.cc
,因此编译器无法使用它。你可以这样做:
g++ main.cc -c -o main.o
g++ foo.cc -c -o foo.o
g++ main.o foo.o -o main
-c
标志使编译器仅执行转换,因此这将单独编译main.cc
和foo.cc
,然后将对象链接在一起以获取可执行文件。通过这种方式,foo::foo
的定义将最终在foo.o
内,并且会在链接时提供。
或者,您可以只提供.cc
个文件。这与上面的三个命令基本相同:
g++ main.cc foo.cc -o main
答案 1 :(得分:1)
您应该编译所有源代码(在您的案例中为.cc
)文件:
g++ main.cc foo.cc -o main
答案 2 :(得分:-1)
当你在foo
中意识到foo.cc
的构造函数时,你应该编译它。
使用g++ main.cc foo.cc -o main
。