我什么时候需要#include .cpp 文件?
When do I need to #include .cpp files?
我的一个作业涉及三个文件:LineType.h、LineType.cpp和Driver.cpp。 Driver.cpp 包含 main() 方法,该方法使用由 LineType.h 和 LineType.cpp.
定义的 class
在我的系统上,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
时,我的编译器抱怨 "Undefined symbols for architecture",我的理解是它找不到 [=25= 的定义] 被调用。
我和我的导师做了哪些不同的事情导致了这种行为上的差异?为什么我的编译器需要的一行导致她的编译器失败?
您应该永远不要直接包含源文件。
相反,您应该在编译时在 g++
命令中列出所有源文件:
g++ Driver.cpp LineType.cpp MyOtherFile.cpp # etc...
使用 #include somefilename
意味着 somefilename 的内容代替了 include.
通过将 #include "LineType.cpp"
放入 Driver.cpp 文件中,您可以有效地将所有内容放入一个文件中,然后使用 g++ Driver.cpp
进行编译对您来说效果很好。
当您的讲师使用 IDE 进行编译时,它会进行单独的编译和 linking。因此它编译了 Driver.cpp 和 LineType.cpp 这两个文件都包含来自 LineType.cpp 的定义。所以当谈到 linking 时,她在 LineType.cpp 中定义了两次,linker 不知道该怎么做。
您可以使用
一次编译和 link 多个文件
g++ Driver.cpp LineType.cpp
或者使用单独的编译和 linking 命令
g++ -c Driver.cpp
g++ -c LineType.cpp
这将生成文件 Driver.o
和 LineType.o
。然后你可以通过 运行
将它们组合在一起
g++ Driver.o LineType.o
我个人强烈不推荐 include
源文件。
但是这个 article 的作者声称包含源文件可以减少订单中大型项目的编译时间。他称此为“统一构建”,并声称该方法广泛应用于游戏行业。 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"
更少的模块意味着更少的重复通用函数和更少的代码生成。 Modules 允许显着减少编译时间,但仍然不符合标准。
我的一个作业涉及三个文件:LineType.h、LineType.cpp和Driver.cpp。 Driver.cpp 包含 main() 方法,该方法使用由 LineType.h 和 LineType.cpp.
定义的 class在我的系统上,Driver.cpp 开头为:
#include "LineType.h"
#include "LineType.cpp"
#include <iostream>
当我通过命令行从项目目录中 运行 g++ Driver.cpp
时,程序编译并 运行 完美。但是,当我的讲师尝试编译该程序时(我相信她使用的是 Eclipse),它无法编译。经过一些来回,她能够通过注释掉来自 Driver.cpp:
#include "LineType.h"
//#include "LineType.cpp"
#include <iostream>
当我试图在这个编辑过的文件上 运行 g++ Driver.cpp
时,我的编译器抱怨 "Undefined symbols for architecture",我的理解是它找不到 [=25= 的定义] 被调用。
我和我的导师做了哪些不同的事情导致了这种行为上的差异?为什么我的编译器需要的一行导致她的编译器失败?
您应该永远不要直接包含源文件。
相反,您应该在编译时在 g++
命令中列出所有源文件:
g++ Driver.cpp LineType.cpp MyOtherFile.cpp # etc...
使用 #include somefilename
意味着 somefilename 的内容代替了 include.
通过将 #include "LineType.cpp"
放入 Driver.cpp 文件中,您可以有效地将所有内容放入一个文件中,然后使用 g++ Driver.cpp
进行编译对您来说效果很好。
当您的讲师使用 IDE 进行编译时,它会进行单独的编译和 linking。因此它编译了 Driver.cpp 和 LineType.cpp 这两个文件都包含来自 LineType.cpp 的定义。所以当谈到 linking 时,她在 LineType.cpp 中定义了两次,linker 不知道该怎么做。
您可以使用
g++ Driver.cpp LineType.cpp
或者使用单独的编译和 linking 命令
g++ -c Driver.cpp
g++ -c LineType.cpp
这将生成文件 Driver.o
和 LineType.o
。然后你可以通过 运行
g++ Driver.o LineType.o
我个人强烈不推荐 include
源文件。
但是这个 article 的作者声称包含源文件可以减少订单中大型项目的编译时间。他称此为“统一构建”,并声称该方法广泛应用于游戏行业。 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"
更少的模块意味着更少的重复通用函数和更少的代码生成。 Modules 允许显着减少编译时间,但仍然不符合标准。