【问题标题】:Merge C++ files into a single source file将 C++ 文件合并到单个源文件中
【发布时间】:2011-05-13 17:45:55
【问题描述】:

我有一个包含多个源文件和多个头文件的 c++ 项目。我想提交我的项目参加需要单个源文件的编程竞赛。是否有自动将所有文件折叠成单个 .cpp 文件的方法?

例如,如果我有 a.cpp、a.h、b.cpp、b.h 等,我想获得一个可以成功编译和运行的 main.cpp。如果我手动执行此操作,我可以简单地合并头文件并将源文件彼此附加吗?外部变量、包含依赖项和前向声明是否存在陷阱?

【问题讨论】:

  • 所有答案都“避免”了这个问题。我无法压缩我的项目,因为在线评委希望单个 cpp 文件能够编译和运行。
  • 解决办法是换个法官。法官应该关心找到一个 makefile 以及从 makefile 输出什么(例如,可执行文件的名称)。但是,当然,这对您来说并不舒适。
  • 我的建议:为 VC 2015 使用像 /E 这样的编译器选项,只执行预处理器。工作原理:生成一个 .cpp 文件,其中包括项目的所有 .cpp 文件#include "a.cpp" #include "b.cpp" ...(没有 .h 文件!)。然后使用 /E 选项编译这个单一的 .cpp 文件。结果 (stdout) 是一个包含整个项目的 .cpp 文件。这不方便,输出也不是真正的美。但是,它有效。

标签: c++


【解决方案1】:

我也需要这个来参加编码比赛。准确地说是代码游戏。所以我写了一个快速的 JavaScript 脚本来解决这个问题。你可以在这里找到它: https://www.npmjs.com/package/codingame-cpp-merge

我在 1 场现场比赛和一场线下比赛中使用了它,并且从未产生过糟糕的结果。随时在 github 上提出更改建议或拉取请求!

【讨论】:

    【解决方案2】:

    一般来说,您不能这样做。虽然您可以愉快地将头文件的内容粘贴到相应的#includes 的位置,但通常不能简单地连接源文件。对于初学者,您最终可能会在文件范围内遇到命名冲突。并且假设您将复制粘贴的头文件(带有类定义等)到每个源文件中,您最终会得到多次定义的类。

    有更好的解决方案。如前所述,为什么不简单地压缩整个项目目录(在清除自动生成的目标文件等之后)?如果你真的必须有一个源文件,那就只写一个源文件!

    【讨论】:

      【解决方案3】:

      嗯,这是可能的,我见过很多项目将源文件合并为单个 .h 和 .c/.cpp,例如 sqlite

      但代码必须有一些限制,例如您的源代码之一中不应有静态全局变量。

      可能没有用于合并资源的通用工具。您应该根据自己的代码编写一个。

      这里有一些例子

      gaclib source pack tool

      【讨论】:

        【解决方案4】:

        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
        

        取自here的用法示例。阅读有关CIL 及其缺点here 的文档。 A binary distribution for Mac OS X and Linux is provided with Tigress.

        【讨论】:

          【解决方案5】:

          我不知道将 .cpp 文件组合在一起的工具,但我会将所有文件压缩在一起并将它们作为 gzip 文件发送。

          【讨论】:

          • 编程竞赛不是这样运作的。
          【解决方案6】:

          我认为带有头文件的项目,源文件必须比只有一个主文件的项目更好。不仅更容易工作和阅读,而且他们知道你在分离程序模块方面做得很好。

          由于您的解决方案,我提供了这种格式,我认为您必须做手工:

          // STL headers
          
          
          // --- prototype
          // monster.h
          
          // prince.h
          
          // --- implementation
          
          int main() { 
          // your main function
          return 0;
          }
          

          【讨论】:

          • 我同意,cpp文件仅供提交。我有多个文件的原因是因为它更易于理解和编辑,但最终输出 HAS 是单个 cpp 文件。
          【解决方案7】:

          如果您选择发送单个文件而不是压缩存档,例如 tarball 或 zip 文件,则可能需要考虑一些事项。

          首先,将文件连接在一起,正如 Thomas Matthews 已经提到的那样。通过一些更改,您通常可以编译一个文件。删除不存在的#include 语句,例如现在已包含的标头。

          您还必须按照它们各自的依赖顺序连接这些文件。也就是说,如果 a.cpp 需要在 b.hpp 中声明的类,那么您很可能需要按照 Thomas Matthews 列出的顺序进行连接。

          话虽如此,我认为共享代码的最佳方式是通过公共存储库,例如 GitHub.comcompressed archive

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多