CMake "安装" 目标及其 SO 依赖项

CMake `INSTALL` for targets and its SO dependencies

本文关键字:quot SO 依赖 目标 安装 CMake      更新时间:2023-10-16

我的目标与使用带有PUBLIC关键字的TARGET_LINK_LIBRARIES的多个库链接,INSTALL命令看起来像INSTALL(TARGETS foo DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)。我想以某种方式强制 cmake 包含我链接的所有(最好不包括系统库(库(仅限 SO(以包含在安装过程中。我尝试过 EXPORT 关键字,但看起来它只影响我在项目中构建的库,并用与库相同的EXPORT标记foo库。
可能吗?
EDIT001:可能影响答案的其他信息。 我正在使用 vcpkg 来管理第三方。所以TARGET_LINK_LIBRARIES看起来像

TARGET_LINK_LIBRARIES(foo PUBLIC
GTest::GTest
GTest::Main
${GOOGLE_MOCK}
event
${THRIFT_LIBRARIES}
${Boost_LIBRARIES}
lzo2
sqlite3
${ZeroMQ_LIBRARY}
gRPC::grpc
gRPC::grpc++
xml2
stdc++fs
bfd
-l:libisal.so.2
sgutils2
pthread
uuid
rt
)

所以,本质上我想要实现的是利用所有这些由vcpkg宏的库,如${THRIFT_LIBRARIES}, ${Boost_LIBRARIES} and gRPC::grpc

从 cmake 3.21 开始,您现在可以执行以下操作:

install(IMPORTED_RUNTIME_ARTIFACTS gRPC::grpc)
install(IMPORTED_RUNTIME_ARTIFACTS ${Boost_LIBRARIES})

等。

请参阅新的安装命令。

CMake 本身不允许自动安装依赖项。这将是一项相当艰巨的任务,因为它必须考虑很多极端情况。

想想传递依赖(我不知道这是否是正确的词(,比如:你的libA取决于libB,这取决于libC。CMake 应该如何从只列出libB的 CMakeList 中获取此信息?

或者:您认为系统库是什么?所有不在PATH的东西?如何知道客户端计算机上在系统范围内安装了哪些库?

你看,有一些非常棘手的事情需要考虑。

以下是您拥有的一些可能性:

  • 要求用户安装依赖项。
  • 将库静态链接到二进制文件。
  • 使用install(FILES files... DESTINATION <dir>)复制库文件。也许您的依赖项管理器可以帮助创建文件列表。
  • 编写一个脚本,为Windows上基于Qt的应用程序执行类似于windeployqt的操作:分析二进制文件(例如使用ldd myApp(并自动复制所需的依赖项。