C++ 未定义的引用编译器错误

C++ 未定义的引用编译器错误,c++,C++,我想我已经接近了,但是我犯了一个错误,我的头撞在墙上已经好几个小时了。我错过了一些愚蠢的东西,我一个角色一个角色地去了,但是我找不到它 编译器正在给我 main.cpp:16: undefined reference to `translator::translator(std::istream&)' collect2: error: ld returned 1 exit status 当我试图编译我的程序时。我用来编译的命令是: clear && g++ -g -Wa

我想我已经接近了,但是我犯了一个错误,我的头撞在墙上已经好几个小时了。我错过了一些愚蠢的东西,我一个角色一个角色地去了,但是我找不到它

编译器正在给我

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; 
}
翻译程序

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

#include "translator.h"


translator::translator(std::istream& in)
{   
table1(in);
table2(in);
}
#包括
#包括
#包括
#包括“translator.h”
translator::translator(std::istream&in)
{   
表1(in);
表2(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
#ifndef转换器
#定义翻译器
#包括
#包括
#包括
#包括“translationTable.h”
类转换器
{
私人:
翻译表1;
翻译表2;
译者();
公众:
翻译(std::istream&in);
};
#恩迪夫

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

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

g++ -g -Wall main.cpp translator.cpp -o Pear
否则,编译器不知道从哪里获得
translator::translator(std::istream&)
成员函数的实现

*编辑:*(来自评论)

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

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

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


头文件用于编译器。具体来说,它们用于编译的第一阶段——预处理。一旦预处理器完成,就不知道这些定义来自何处。连编译器都不知道,更不用说链接器了。这就是为什么您需要通过向
g++

提供所有相关源来“帮助”链接器,因为您没有将translator.o链接到应用程序

g++ -g -c translator.cpp

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

嗯。你希望编译器猜出它需要编译哪些文件吗?@H2CO3-这就是Java所做的。@PeteBecker这是它不应该做的。哇,太快了。对不起,不过我有点困惑。我认为头文件的使用基本上是为了让它知道从何处获取文件的每个实现?@pgowdy13-当编译源文件时,头文件告诉编译器从其他地方可以使用哪些函数,以便它知道它们采用什么参数类型以及返回什么类型。它不会告诉编译器在哪里可以找到这些函数;你必须说出来。没有规定源文件必须与头文件具有相同的基名称,也没有规定头文件中声明的所有函数必须在同一个源文件中实现。所以我基本上需要分别编译它们?这是我第一次将所有文件拆分为单独的实现文件和头文件。我通常只是用main编写整个程序。是的,除非你使用像make(或IDE,集成开发环境)这样的依赖关系管理工具,否则你必须指定要编译哪些模块并链接在一起以创建可执行文件。查看网站或谷歌“编译与链接”以获取更多参考。g++实际上是编译和链接步骤的前端,因此您可以单独编译每个文件(如我所示),也可以在一个步骤中编译和链接(如另一个答案所示)。但一定要接受其中一个答案。