在现代 CMake 项目中存档静态依赖项
Archiving static dependencies in modern CMake project
我需要打包一个链接到其他一些静态库的C++库,我希望能够单独交付编译的文件,而无需也交付传递依赖项。为此,我遵循了有关现代 CMake 技术的指南,并且我已将所有需要的依赖项指定为PRIVATE
,因为它们未在我的库公开的 API 中使用。
问题是,尽管已将依赖项指定为PRIVATE
,但链接器仍然没有将它们包含在输出库中,因此如果我尝试将我的库链接到可执行文件,链接器会抱怨缺少符号(至少使用 MSVC(。有没有办法解决这个问题?
我已经看过了这个,但我不确定如何将其集成到现有的 INSTALL 目标中
假设您正在创建一个静态库:
您会收到未解析的符号,因为静态库中的依赖项在创建过程中未解析。仅当您将静态库链接到可执行文件或共享库时,链接器才会实际尝试解析所需的符号(在您的情况下会失败(。
因此,您需要将静态库组合成一个(正如您已经发现的那样(。
您应该遵循将add_custom_command
和add_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 外部和内部静态库的循环依赖关系
- 如何将 SDL2 用作我的静态 (CMake ) 库的 3D 方依赖项?
- 依赖于依赖类型的非静态数据成员的非限定名称
- 您如何将所有链接依赖项都包装到一个Linux静态库中
- 如何使用捆绑依赖项-CMAKE构建静态库
- 具有依赖于实现的成员函数类型的多个静态接口
- 在不同翻译单元中具有静态存储持续时间的依赖非局部常量浮点变量的常量初始化
- cmake-包括静态库中的依赖项
- 这是静态库依赖树中的菱形问题吗?
- 是否可以编译具有在编译时无法解析的外部依赖项的静态库?
- 依赖于其他静态库的静态库
- 为 c++ 构建一个静态库,该库在内部依赖于第三方库
- 相互依赖的静态库
- 完全静态构建具有所有依赖项(libgcc等)的应用程序
- 添加本机静态依赖项
- 如何调试静态依赖项加载问题