我什么时候需要#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
,我编译器抱怨“架构的未定义符号”,我的理解是它无法找到所调用的类/方法的定义。
我的老师和我的行为有什么不同?为什么我的编译器所需的行会导致编译器失败?
使用#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.o
和LineType.o
一次连结多个文件。然后你就可以在一起运行
g++ Driver.o LineType.o
你应该从来没有直接包含源文件。
相反,你应该列出在g++
命令所有的源文件,当您编译:
g++ Driver.cpp LineType.cpp MyOtherFile.cpp # etc...
对于懒惰的初学者,使用'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可以大幅缩短编译时间,但仍不符合标准。
游戏程序员中存在一定数量的(umm)宗教信仰(就像任何其他组织一样)。宗教背后往往有一些真相,但也过分接受教条。例如,喜欢通过增量构建完成重建或者在多个编译单元中包含复杂标题(例如,使用模板实例化)可以增加总体(而非增量)构建时间。有时声称统一编译可以帮助编译器优化,但是现代工具链支持链接时间优化减弱了这个参数。 – Peter
初学者应该永远不需要包含源文件。相反,你应该阅读*独立编译*和*目标文件*和*链接*。 –
你不应该'#include'一个cpp文件。你的教师的构建系统更像'g ++ Driver.cpp LineType.cpp'(虽然它比这更好) – Justin