我的一个家庭作业涉及三个文件: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;,我理解这意味着它无法找到类/方法的定义调用。
我的导师和我做了哪些不同的行为导致这种差异?为什么我的编译器需要一行导致她的编译器失败?
答案 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.o
和LineType.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允许显着减少编译时间,但仍然不符合标准。