我想我已经接近了,但是我遇到了这个错误,我一直在撞墙几个小时。我错过了一些愚蠢的东西,而且我已逐字逐句,但我找不到它。
编译器给了我
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
有什么想法吗?我已经尝试了很多,我已经查找了类似的问题,但它们都有不同的来源。提前谢谢!
答案 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