【发布时间】:2021-11-08 14:05:36
【问题描述】:
我有一个与 cmake 邮件列表中的 described 非常相似的问题,我们有一个依赖于许多静态库的项目(所有这些库都是从各个子模块中的源代码构建的,每个子模块都有自己的 CMakeLists.txt 描述构建过程每个库)我想组合成一个静态库以发布给消费者。我的库的依赖项可能会发生变化,我不想让开发人员进一步负担这些变化。简洁的解决方案是将所有库捆绑到一个库中。
有趣的是,target_link_libraries 命令在将目标设置为mylib 并像这样使用它时并没有结合所有的静态数据。 .
target_link_libraries(mylib a b c d)
但是,奇怪的是,如果我将 mylib 项目设为可执行项目的子模块,并且仅在顶级可执行文件 CMAkeLists.txt 中链接到 mylib,则该库似乎确实被合并了。 IE。 mylib 是 27 MB,而不是当我将目标设置为仅构建 mylib 时的 3MB。
有一些解决方案描述了将库解包到目标文件中并重新组合(here 和 here),但是当 CMake 似乎完全能够如上例中所述自动合并库时,这似乎非常笨拙。是否有我缺少的魔术命令,或者推荐的制作发布库的优雅方式?
【问题讨论】:
-
但是您将如何处理所有这些包含文件和目录?
-
@Drop 它们都被剔除或隐藏在
mylib的公共界面后面。 deps 应该对消费者不可见 -
如果您使用 gcc,并且不要求您的 makefile 独立于编译器,您可以尝试
--whole-archive选项。 -
@KarstenKoop 需要同时是 Apple Clang 和 GCC
-
嗯@n.m。我希望让 CMake 以独立于平台的方式执行此操作,因为这是该工具的重点。我在下面的答案有效,但由于其平台依赖性而很糟糕
标签: c++ c cmake static-libraries