g ++ undefined对构造函数的引用,非常简单的代码

时间:2015-11-14 01:28:24

标签: c++

我制作了一个程序来测试我在课堂上的知识,但是我遇到了一些麻烦。

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

我认为这里应该有一个非常愚蠢的错误,但我真的找不到它。我这整个晚上都在挣扎......

感谢任何帮助!

3 个答案:

答案 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.ccfoo.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