CMake `INSTALL` 用于目标及其 SO 依赖项

CMake `INSTALL` for targets and its SO dependencies

我的目标 link 使用带有 PUBLIC 关键字的 TARGET_LINK_LIBRARIES 和几个库编辑,INSTALL 命令看起来像 INSTALL(TARGETS foo DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)。我想以某种方式强制 cmake 将所有(最好不包括系统库)库(仅限 SO)包含在安装过程中 link。我试过 EXPORT 关键字,但看起来它只影响我在我的项目中构建的库,并用与 foo 库相同的 EXPORT 标记。
可能吗?
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 本身不允许自动安装依赖项。这将是一项相当艰巨的任务,因为它必须考虑很多极端情况。

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

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

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

以下是您的一些可能性:

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

从 cmake 3.21 开始,您现在可以使用:

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

等等

参见new Install command