何时需要 #include .cpp 文件?
When do I need to #include .cpp files?
我的一个作业涉及三个文件: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.o
和LineType.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"
更少的模块意味着更少的重复常用函数和更少的代码生成。模块允许大大减少编译时间,但仍然不是标准的。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 为什么我的主文件.cpp不打印头文件中的任何内容
- 生成文件错误 - 找不到文件 - *.cpp
- 如何在文件.cpp gtkmm中声明小部件
- 没有实现文件(.cpp)的派生类
- 如何使用"CMakeLists.txt"中的add_library将整个文件(.cpp,.h等)包含在目录中
- 如何在Linux / Windows操作系统上使用文件*.cpp一步编译下面的代码
- 关于 Linux .so 文件无法链接到主文件.cpp文件
- 文件.cpp从Windows到Linux
- Ubuntu C++ 编译器错误: g++: 错误: 文件.cpp: 没有这样的文件或目录
- 如何将文件.cpp编译为本机编译
- 使用模板类时,似乎无法包含除 main 以外的任何 cpp 文件.cpp
- 无法编译C++文件.cpp。C++98模式
- 为什么C++头文件不需要包含实现文件 (.cpp)
- 如何访问位于独立文件(.cpp)中的非成员函数
- 如何在Visual Studio Code中通过键盘快捷键切换头文件/cpp文件
- 如何将数据从stringstream写入文件(CPP)
- 为什么filestream不把空白写入文件cpp ?