【发布时间】: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 仅标头库。我不确定我是否理解你的意思。