何时需要 #include .cpp 文件?

When do I need to #include .cpp files?

本文关键字:文件 cpp #include 何时需      更新时间:2023-10-16

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

在我的系统上,驱动程序.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时,我的编译器抱怨"架构的未定义符号",我理解这意味着它找不到被调用的类/方法的定义。

我的导师和我做了什么不同的事情来导致这种行为差异?为什么编译器所需的行会导致编译器失败?

切勿直接包含源文件。

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

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

使用#include somefilename意味着将某个文件名的内容放在包含的位置。
通过将#include "LineType.cpp"放入 Driver.cpp 文件中,您可以有效地将所有内容放入一个文件中,然后使用g++ Driver.cpp进行编译对您来说效果很好。
当教师使用 IDE 进行编译时,它会进行单独的编译和链接。所以它编译了驱动程序.cpp和线型.cpp这两个文件都包含来自线类型的定义.cpp因为包括。因此,当涉及到链接时,她在 LineType 中找到了所有内容.cpp两次,链接器不知道该怎么办。 您可以使用

g++ Driver.cpp LineType.cpp 

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

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

这将生成Driver.oLineType.o的文件。然后,您可以通过运行将它们组合在一起

g++ Driver.o LineType.o

我个人强烈建议不要include源文件。 但本文的作者声称,包含源文件可以减少订单中的大型项目编译时间。他称之为"团结构建",并声称这种方法在游戏行业中被广泛使用。unity构建的主要思想是减少编译中的模块数量。喜欢这个:

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"

更少的模块意味着更少的重复常用函数和更少的代码生成。模块允许大大减少编译时间,但仍然不是标准的。