编译静态库时收集所有头文件

Posted

技术标签:

【中文标题】编译静态库时收集所有头文件【英文标题】:Collect all header files when compiling static library 【发布时间】:2019-02-04 12:37:50 【问题描述】:

我正在使用 Cmake 从源代码编译库的静态版本。

源代码的结构如下所示:

src/ 
   module1/
       x.cpp
       x.h
       ... 
   module2/
       y.cpp
       y.h
       ...

等等……

编译静态版本的库并不难。但是出于分发目的,我只想分发标头 (x.h, y.h, ...) 和静态库 (module1.a, module2.a, ...)。

GCC 或 CMAKE 中是否有一些命令可以自动收集所有标题并将它们放入单独的文件夹中?

我知道我可以手动分离源代码和标头,或者我可以简单地分发所有代码(源代码和标头),但这对于我的特定用例来说既浪费又不受欢迎。或者,我可以编写一个非常简单的 Python 脚本来执行此操作,但在我看来,这可能是一个非常常见的场景。所以我猜想在 Gcc 或 Cmake 中有一些东西可以做到这一点。

注意:我不负责维护代码库,因此我对项目的结构没有发言权。如果是,我可以将代码分成srcinclude 文件夹。

【问题讨论】:

难道没有好的 ol' unix find 可以满足您的需要或者您需要跨平台支持吗? 原则上是的。但是,我想将代码作为 SDK 的一部分进行分发。不分发源代码的原因主要是因为我们正在为空间非常宝贵的嵌入式系统进行编译,并且源代码大于 1MB。 【参考方案1】:

最好的办法是使用 cmake glob 并安装所有工件。

# append to your existing CMakeLists.txt
install(TARGETS module1 module2 #adjust to use your names
        ARCHIVE DESTINATION lib)
file(GLOB_RECURSE header_list "*.h") #adjust if necessary
install(FILES $header_list
        DESTINATION include)

请注意,通配不是完美的,文件列表仅在运行 cmake 时更新(即,它不会自行检测添加或删除的文件)。

【讨论】:

一个简单的老式简单复制命令而不是神奇的“安装”命令怎么样? @CJohnson - 原始命令提到了一个 SDK,因此安装打开了使用 cpack 自动生成 tarball 的大门。

以上是关于编译静态库时收集所有头文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

Windows系统下静态库和动态库的使用方法

Python编译解释动态库静态库编译过程头文件了解一下

如何用VS 2008编译出可通用的lib静态库

Linux静态库生成指南

静态库和动态库的生成和编译