【问题标题】:Generating a single include file from a hierarchy of includes [duplicate]从包含的层次结构生成单个包含文件[重复]
【发布时间】:2020-07-24 09:19:32
【问题描述】:

我有一个仅用于标头的库的 C++ 存储库(通过 CMake 构建,尽管这并不重要)。它的结构大致是:

include/
  mylib.hpp
  mylib/
    foo.hpp
    bar.hpp

现在,我知道一些流行的 C++ 库是作为单头文件维护的。我不喜欢把所有东西都扔进厨房水槽文件;但同时我也很欣赏只需下载一个文件即可使用库的便利。

所以,我在想 - 也许我可以在安装过程中生成单个头文件?

据说这是一个“简单的预处理问题”;但是 - 实际上并不是那么简单:

  • 我不想完全预处理 C++ 文件,只需要 #include 指令。
  • 并非所有包含文件都是相关的 - 只有特定源树下的文件。
  • 在实际编译期间,同一个文件被多次包含(忽略潜在的编译器优化),第二个和以后的副本通常在以后使用包含保护或#pragma once 删除;在我的情况下,需要注意并防止双重包含。

那么,我的问题是:我该怎么做呢?

注意:

  • 基于 CMake 的方法会很好,但任何合理的方法都可以。

【问题讨论】:

  • 我觉得 GoogleTest 也有类似的,看看是否适合你:fuse_gtest_files.py(第 149-175 行似乎负责生成头文件)
  • @Yksisarvinen:我去看看,谢谢。我实际上有自己的答案,但现在我不能发布它,因为我已经关闭了。咕噜。
  • 库至少扩展了宿主语言的功能(请参阅 Yksis 注释用于压缩标题和源)。您的标头在功能上将是包含的样板,只是用户不知道他们包含什么(或者是否是必要的)。 (顺便说一句,我什么都用我的系统包管理器,所以这个评论显然很偏颇)
  • @Braiam:它们包括 mylib 仅标头库。我不确定我是否理解你的意思。

标签: c++ packaging


【解决方案1】:

你可以自己编写一个解析器。你给它开始文件。它将所有#includes 替换为实际文件。如果要包含的文件已经包含,则跳过它(类似于编译器对包含保护的行为)

【讨论】:

  • 所以,我实际上只是找到了一个(有点难看的)parser - 但我无法发布答案,因为他们关闭了我的问题 T_T。
【解决方案2】:

以@uIM7AI9S 的建议为基础——这种机制肯定存在于其他希望使用多个文件进行开发但仍提供单个包含文件便利的库中。一个例子是Lyra,一个命令行参数解析库;它使用基于 Python 的包含文件 fuser/joiner,您可以找到 here

我可以挑剔那个东西的代码,但是 - 嘿,它可以工作,而且它是 FOSS - 与 Boost 许可证一起分发。

不幸的是,Lyra 开发人员似乎预先生成了单个标头,并且该过程不是基于 CMake 的构建的一部分(尽管存储库的根目录中有一个 CMakeLists.txt 文件)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多