未定义的参考编译器错误

时间:2013-02-10 23:20:10

标签: c++

我想我已经接近了,但是我遇到了这个错误,我一直在撞墙几个小时。我错过了一些愚蠢的东西,而且我已逐字逐句,但我找不到它。

编译器给了我

main.cpp:16: undefined reference to `translator::translator(std::istream&)'
collect2: error: ld returned 1 exit status

当我尝试编译我的程序时。我用来编译的命令是:

clear && g++ -g -Wall main.cpp -o Pear

使用的三个部分如下:

的main.cpp

int main(int argc, char* argv[])
{

std::ifstream myFile;

myFile.open(argv[1]);

translator example(myFile); 

myFile.close(); 

return 0; 
}

translator.cpp

#include <fstream>
#include <iostream>
#include <string>

#include "translator.h"


translator::translator(std::istream& in)
{   
table1(in);
table2(in);
}

translator.h

#ifndef TRANSLATOR
#define TRANSLATOR

#include <fstream>
#include <iostream>
#include <string>

#include "translationTable.h"


class translator
{
private:

translationTable<std::string, int> table1;

translationTable<int, std::string> table2;

translator(); 

public:

translator(std::istream& in); 

};



#endif

有什么想法吗?我已经尝试了很多,我已经查找了类似的问题,但它们都有不同的来源。提前谢谢!

2 个答案:

答案 0 :(得分:6)

g++的命令行需要包含两个源文件,如下所示:

g++ -g -Wall main.cpp translator.cpp -o Pear

否则,编译器不知道从哪里获得translator::translator(std::istream&)成员函数的实现。

* 编辑:* (来自评论)

  

我认为基本上使用头文件是为了知道在哪里获得文件的每个实现?

这部分过于简单,但它可以帮助你了解情况。回想一下,从C ++源生成可执行文件的过程包括两个主要步骤 - 编译和链接。 g++程序同时执行它们(如果指定-c标志,则只能执行一个,或仅传递.o个文件。)

g++的编译器和链接器阶段不直接相互“交谈”。编译器为链接器生成输入,这就是通信结束的地方。

头文件用于编译器。具体来说,它们用于编译的第一阶段 - 预处理。一旦预处理器完成,就不知道定义来自何处。甚至编译器也不知道它,更不用说链接器了。这就是为什么您需要通过向g++提供所有相关来源来“帮助”链接器。

答案 1 :(得分:2)

您没有将translator.o与您的应用程序相关联。

g++ -g -c translator.cpp

接着是

g++ -g -Wall main.cpp translator.o -o Pear