在现代CMake项目中存档静态依赖项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在现代CMake项目中存档静态依赖项相关的知识,希望对你有一定的参考价值。

我需要打包一个链接到其他一些静态库的C ++库,我希望能够单独发送已编译的文件,而不需要发送传递依赖项。为此,我正在关注this guide regarding modern CMake techniques,并且我已将所有必需的依赖项指定为PRIVATE,因为它们未在我的库的公开API中使用。

问题在于,尽管已将依赖关系指定为PRIVATE,但链接器仍未在输出库中包含它们,因此如果我尝试将我的库链接到可执行文件,链接器将会抱怨缺少符号(至少使用MSVC)。有办法解决这个问题吗?

我已经看过this,但我不确定如何将它集成到现有的INSTALL目标中

答案

假设您正在创建静态库:

您收到未解析的符号,因为静态库中的依赖项在创建期间未得到解析。只有当您将静态lib链接到可执行文件或共享库时,链接器才会尝试解析所需的符号(并且在您的情况下将失败)。

因此,您需要将静态库组合到一个静态库中(正如您已经发现的那样)。

您应该遵循组合add_custom_commandadd_custom_target的方法,这些方法在您链接的答案(https://stackoverflow.com/a/32888999/1228449)中列出。

然后使用INSTALL( FILES ....)将组合库添加到安装命令中,例如:

include(GNUInstallDirs)
INSTALL( FILES ${LIBNAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} )

编辑:或者,创建一个共享库。

ADD_LIBRARY( mylibrary SHARED ...)

然后,在库的链接时解析私有静态库的必需符号。此外,只有您的库实际使用的符号才会集成到您的库中(而静态库将包含所有内容)。

以上是关于在现代CMake项目中存档静态依赖项的主要内容,如果未能解决你的问题,请参考以下文章

使用 CMake 将几个静态库合并为一个

如何删除 cmake 静态库的编译依赖项?

为啥 FetchContent 更喜欢子目录包含而不是安装依赖项?

如何在 CMake GUI 中显示 FooConfig.cmake 文件中的 CMake 变量?

如何将 emscripten 与 cmake 一起用于项目依赖项?

在 CMake 中构建时运行 python 脚本,不需要依赖项