c++ - 在现代 CMake 项目中归档静态依赖项
问题描述
我需要打包一个链接到其他一些静态库的 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 ...)
然后在链接时解析私有静态库所需的符号。此外,只有您的库实际使用的符号才会集成到您的库中(而静态库将包含所有内容)。
推荐阅读
- python - Networkx 度中心性
- java - 将空字符与字符进行比较会引发异常
- php - 函数调用后PHP代码不继续
- django - 如何将值从 get_queryset() 传递到 get_context_data()
- html - 如何在使用 ng-repeat 时在 css 中应用一个类
- python - python打开一个包含整数的文件
- go - 从golang调用时无法从调用GetConfiguration获取itemCategory信息
- python - Predict_proba() 的随机森林分类器结果与 predict() 不匹配?
- gcc - RISC-V 压缩指令:可以强制编译器在 32 位边界上对齐 32 位指令吗?
- r - 在 R 自动化中将数据附加到具有当前日期的现有数据