将C++文件合并为单个源文件
Merge C++ files into a single source file
我有一个包含多个源文件和多个头文件的 c++ 项目。 我想提交我的项目参加一个需要单一源文件的编程竞赛。有没有一种将所有文件折叠成单个.cpp文件的自动方法?
例如,如果我有 a.cpp、a.h、b.cpp、b.h 等,我想得到一个 main.cpp它将成功编译和运行。 如果我手动执行此操作,我可以简单地合并头文件并将源文件相互附加吗? 外部外部是否有陷阱,包括依赖项和前向声明?
我也需要这个来参加编码比赛。准确地说是科丁加姆。所以我写了一个快速的JavaScript脚本来解决这个问题。你可以在这里找到它: https://www.npmjs.com/package/codingame-cpp-merge
我在 1 场现场比赛和一场离线比赛中使用了它,它从未产生过糟糕的结果。随时在 github 上提出更改建议或提出拉取请求!
一般来说,你不能这样做。 虽然您可以愉快地将头文件的内容粘贴到相应#include
的位置,但通常不能简单地连接源文件。 对于初学者来说,您最终可能会在具有文件范围的事物之间发生命名冲突。 鉴于您将复制粘贴的头文件(带有类定义等)到每个源文件中,您最终将获得多次定义的类。
有更好的解决方案。 如前所述,为什么不简单地压缩整个项目目录(在清除自动生成的对象文件等之后)? 如果你真的必须有一个源文件,那么只需编写一个源文件!
嗯,这是可能的,我见过很多项目将源文件合并为单个.h和.c/.cpp,例如sqlite
但是代码必须有一些限制,例如在源代码中不应该有静态全局变量。
可能没有用于组合源的通用工具。您应该在代码上编写一个基础。
以下是一些示例
盖克利布源码包工具
CIL
实用程序能够做到这一点:
$TIGRESS_HOME/cilly --merge -c x1.c -o x1.o
$TIGRESS_HOME/cilly --merge -c x2.c -o x2.o
$TIGRESS_HOME/cilly --merge -c x3.c -o x4.o
$TIGRESS_HOME/cilly --merge --keepmerged x1.o x2.o x3.o -o merged --mergedout=merged.c
从这里获取的使用示例。在此处阅读有关CIL
及其缺点的文档。Mac OS X
和Linux
的二进制分布提供了Tigress
。
我认为带有标题、源文件的项目必须比只有一个主文件的项目更好。不仅更容易工作和阅读,而且他们知道您在分离程序模块方面做得很好。
由于您的解决方案,我提供了这种格式,我认为您必须进行手工工作:
// STL headers
// --- prototype
// monster.h
// prince.h
// --- implementation
int main() {
// your main function
return 0;
}
我刚刚找到了一个非常适合我的 npm 包,正是为了海豚:cpp 合并
我提供链接:https://www.npmjs.com/package/cpp-merge
要安装: npm install -g cpp-merge
要使用: cpp-merge file.cpp
这将创建一个合并文件,其中包含 #include "library.cpp"
中指定的所有文件,在 file.cpp 中。
另外,值得一提的是,它进入标准输出。要将其定向到文件,您可以执行以下操作:
cpp-merge --output output.cpp
查看文档以获取更多详细信息!
工具可以将.cpp文件组合在一起,但我只是将所有文件压缩在一起并将它们作为gzip文件发送。
如果您选择发送单个文件而不是压缩存档,例如压缩包或 zip 文件,则可能应考虑一些事项。
首先,将文件连接在一起,正如托马斯·马修斯已经提到的。只需进行一些更改,通常即可编译一个文件。删除不存在的 #include
语句,例如现在包含的标头。
您还必须按各自的依赖项顺序连接这些文件。也就是说,如果 a.cpp 需要一个在 b.hpp 中声明的类,那么你很可能需要按照 Thomas Matthews 列出的顺序连接。
话虽如此,我认为共享代码的最佳方式是通过公共存储库,例如 GitHub.com 或压缩存档。
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 为测试目标创建具有不同源文件夹的文件
- 将图像添加到资源文件夹UWP C++
- 视觉工作室项目.提取源文件夹名称
- 生成一个生成文件,该生成文件使用Automake在一个步骤中编译和链接所有源文件
- Eclipse CDT:单个项目中有多个C++文件
- make 命令如何避免重新编译未更改的源文件?
- 为什么我们将单个或多维数组的大小声明为常量值?
- C++调用具有 *this 属性的单个帮助程序函数
- C++两个源文件之间共享的枚举的静态实例
- 在 Visual Studio 中的 1 个项目中编译单个 C++ 源文件
- 如何使用 qmake 为单个源文件指定编译器标志
- 如何在大型项目中预处理具有多个 #include 文件的单个源文件
- 何时可以使用具有单个标头的多个源文件
- XCode:如何为单个源文件添加预处理器定义
- c++ 从单个源文件转换到多个文件。错误:'blank'未命名类型
- 如何使用gcc使用多个源文件创建单个对象文件
- 将C++文件合并为单个源文件
- 在C或c++源文件中展开单个宏