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

时间:2017-07-14 20:02:41

标签: c++ include header-files

我的一个家庭作业涉及三个文件:LineType.h,LineType.cpp和Driver.cpp。 Driver.cpp包含main()方法,该方法使用LineType.h和LineType.cpp定义的类。

在我的系统上,Driver.cpp以:

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

当我通过命令行从项目目录中运行g++ Driver.cpp时,程序编译并运行完美。但是,当我的教师尝试编译程序时(我相信她使用Eclipse),它无法编译。经过一番来回,她能够通过评论出Driver.cpp中的一个#includes来解决问题:

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

当我尝试在这个编辑过的文件上运行g++ Driver.cpp时,我的编译器抱怨&#34;未定义的架构符号&#34;,我理解这意味着它无法找到类/方法的定义调用。

我的导师和我做了哪些不同的行为导致这种差异?为什么我的编译器需要一行导致她的编译器失败?

3 个答案:

答案 0 :(得分:7)

永远不会直接包含源文件。

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

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

答案 1 :(得分:4)

使用#include somefilename表示 somefilename 的内容代替包含。
通过将#include "LineType.cpp"放入Driver.cpp文件中,您可以有效地将每个标题放在一个文件中,然后使用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

答案 2 :(得分:1)

我个人强烈建议不要向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允许显着减少编译时间,但仍然不符合标准。