2

我想我已经接近了,但我遇到了这个错误,我已经把头撞在墙上好几个小时了。我错过了一些愚蠢的东西,我已经逐个字符地走了,但我找不到它。

编译器给了我

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

三个部分的使用如下:

主文件

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

std::ifstream myFile;

myFile.open(argv[1]);

translator example(myFile); 

myFile.close(); 

return 0; 
}

翻译器.cpp

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

#include "translator.h"


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

翻译器.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

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

4

2 回答 2

7

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

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

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

*编辑:*(来自评论)

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

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

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

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

于 2013-02-10T23:21:39.710 回答
2

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

g++ -g -c translator.cpp

其次是

g++ -g -Wall main.cpp translator.o -o Pear
于 2013-02-10T23:22:04.867 回答