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

Archiving static dependencies in modern CMake project

本文关键字:静态 依赖 CMake 项目      更新时间:2023-10-16

我需要打包一个链接到其他一些静态库的C++库,我希望能够单独交付编译的文件,而无需也交付传递依赖项。为此,我遵循了有关现代 CMake 技术的指南,并且我已将所有需要的依赖项指定为PRIVATE,因为它们未在我的库公开的 API 中使用。

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

我已经看过了这个,但我不确定如何将其集成到现有的 INSTALL 目标中

假设您正在创建一个静态库:

您会收到未解析的符号,因为静态库中的依赖项在创建过程中未解析。仅当您将静态库链接到可执行文件或共享库时,链接器才会实际尝试解析所需的符号(在您的情况下会失败(。

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

您应该遵循将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 ...)

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