Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 何时需要包含.cpp文件?_C++_Include_Header Files - Fatal编程技术网

C++ 何时需要包含.cpp文件?

C++ 何时需要包含.cpp文件?,c++,include,header-files,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时,我的编译器抱怨“架构的未定义符

我的一个家庭作业涉及三个文件: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
时,我的编译器抱怨“架构的未定义符号”,我理解这意味着它找不到被调用的类/方法的定义

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

您不应该直接包含源文件

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

g++ Driver.cpp LineType.cpp MyOtherFile.cpp # etc...
使用
#include somefilename
意味着将somefilename的内容替换为include。
通过将
#include“LineType.cpp”
放在Driver.cpp文件中,您可以有效地将所有内容放在一个文件中,然后使用
g++驱动程序进行编译。cpp
对您来说很好。
当您的讲师使用IDE进行编译时,它会进行单独的编译和链接。因此,它编译了Driver.cpp和LineType.cpp这两个文件都包含来自LineType.cpp的定义,这是因为包含了这些定义。所以当谈到链接时,她在LineType.cpp中定义了两次所有内容,而linker不知道该怎么做。 您可以使用一次编译和链接多个文件

g++ Driver.cpp LineType.cpp 
或者使用单独的编译和链接命令

g++ -c Driver.cpp
g++ -c LineType.cpp
它将生成文件
Driver.o
LineType.o
。然后你可以通过跑步将它们结合在一起

g++ Driver.o LineType.o

就我个人而言,我强烈建议不要包含源文件。 但本文作者声称,包含源文件可以按顺序减少大型项目的编译时间。他称这种方法为“统一构建”,并声称这种方法在游戏行业中得到了广泛应用。unity build的主要思想是减少编译中的模块数量。像这样:

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"

更少的模块意味着更少的重复和更少的代码生成。允许大幅减少编译时间,但仍不符合标准。

初学者永远不需要包含源文件。相反,你应该阅读单独的编译文件、目标文件和链接。你不应该把cpp文件包括在内。教练的构建系统更像是
g++Driver.cpp LineType.cpp
(尽管它比这更好),对于懒惰的初学者,使用
g++*.cpp
,你会得到目录中的每个cpp文件。游戏程序员(像任何其他群体一样)都有一定程度的(嗯)信仰。宗教背后往往有一些真理,但也过分接受教条。例如,与增量构建或包含在多个编译单元中的复杂头(例如,使用模板实例化)相比,更喜欢完整重建会增加总(而不是增量)构建时间。有时有人声称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"