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

时间:2018-08-30 14:12:26

标签: c++ cmake static dependencies

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

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

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

1 个答案:

答案 0 :(得分:0)

假设您正在创建静态库:

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

因此,您需要将静态库合并为一个库(如您所知)。

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

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