我什么时候需要#include .cpp文件?

问题描述:

我的作业之一涉及三个文件:LineType.h,LineType.cpp和Driver.cpp。 Driver.cpp包含使用由LineType.h和LineType.cpp定义的类的main()方法。我什么时候需要#include .cpp文件?

在我的系统,Driver.cpp开头:

#include "LineType.h" 
#include "LineType.cpp" 
#include <iostream> 

而且程序编译和运行完美,当我通过命令行从项目目录中运行g++ Driver.cpp。但是,当我的教师试图编译程序(我相信她使用Eclipse)时,它无法编译。一些背部和往复之后,她能够通过注释掉从Driver.cpp#包括一个固定在她到底问题出在:

#include "LineType.h" 
//#include "LineType.cpp" 
#include <iostream> 

当我试图在此编辑的文件运行g++ Driver.cpp,我编译器抱怨“架构的未定义符号”,我的理解是它无法找到所调用的类/方法的定义。

我的老师和我的行为有什么不同?为什么我的编译器所需的行会导致编译器失败?

+7

初学者应该永远不需要包含源文件。相反,你应该阅读*独立编译*和*目标文件*和*链接*。 –

+1

你不应该'#include'一个cpp文件。你的教师的构建系统更像'g ++ Driver.cpp LineType.cpp'(虽然它比这更好) – Justin

使用#include somefilename意味着somefilename的内容到位的包括。
通过将#include "LineType.cpp"放入您的Driver.cpp文件中,您可以有效地将everythig放在一个文件中,然后使用g++ Driver.cpp进行编译,适合您。
当您的教师使用IDE进行编译时,它进行了单独的编译和链接。所以它编译Driver.cpp和LineType.cpp这两个文件都包含来自LineType.cpp的定义,因为包含这些定义。所以当涉及到链接时,她将LineType.cpp中的所有内容都定义了两次,链接器不知道该怎么做。 您可以编译和使用

g++ Driver.cpp LineType.cpp 

或者使用单独的编译和链接命令

g++ -c Driver.cpp 
g++ -c LineType.cpp 

系统将生成文件Driver.oLineType.o一次连结多个文件。然后你就可以在一起运行

g++ Driver.o LineType.o 

你应该从来没有直接包含源文件。

相反,你应该列出在g++命令所有的源文件,当您编译:

g++ Driver.cpp LineType.cpp MyOtherFile.cpp # etc... 
+2

对于懒惰的初学者,使用'g ++ * .cpp',你会得到目录中的每个cpp文件。 – Justin

个人而言,我强烈不建议include源文件合并。 但是article的作者声称包含源文件可以减少订单中的大型项目编译时间。他称这种“团结构建”,并声称这种方法在游戏行业被广泛使用。统一构建的主要思想是减少编译中的模块数量。像这样:

my_unity_build_1.cpp: 

#include "renderer.cpp" 
#include "ui_elements.cpp" 
#include "gameplay_code.cpp" 
#include "character_AI.cpp" 

my_unity_build_2.cpp: 

#include "file_io.cpp" 
#include "cat_dynamics.cpp" 
#include "wobbly_bits.cpp" 
#include "death_ray.cpp" 

更少的模块意味着更少的重复常用功能和更少的代码生成。 Modules可以大幅缩短编译时间,但仍不符合标准。

+0

游戏程序员中存在一定数量的(umm)宗教信仰(就像任何其他组织一样)。宗教背后往往有一些真相,但也过分接受教条。例如,喜欢通过增量构建完成重建或者在多个编译单元中包含复杂标题(例如,使用模板实例化)可以增加总体(而非增量)构建时间。有时声称统一编译可以帮助编译器优化,但是现代工具链支持链接时间优化减弱了这个参数。 – Peter