繁体   English   中英

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

[英]When do I need to #include .cpp 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时,我的编译器抱怨“体系结构的未定义符号”,我理解这意味着它无法找到所调用的类/方法的定义。

我的老师和我做些什么不同以引起这种行为上的差异? 为什么我的编译器要求的一行导致她的编译器失败?

绝对不应直接包含源文件。

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

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

使用#include somefilename意味着somefilename的内容到位的包括。
通过将#include "LineType.cpp"放入Driver.cpp文件中,可以将每个文件有效地放入一个文件中,然后使用g++ 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

我个人强烈建议不要include源文件。 但是本文的作者声称,包括源文件可以按顺序减少大型项目的编译时间。 他称此为“统一体”,并声称该方法已广泛用于游戏行业。 统一构建的主要思想是减少编译中的模块数量。 像这样:

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"

更少的模块意味着更少的重复通用功能和更少的代码生成。 模块可以极大地减少编译时间,但是仍然不是标准的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM