7

我的目标使用TARGET_LINK_LIBRARIESwithPUBLIC关键字与多个库链接,INSTALL命令看起来像INSTALL(TARGETS foo DESTINATION ${CMAKE_INSTALL_PREFIX}/bin). 我想以某种方式强制 cmake 包含我链接的所有(最好不包括系统库)库(仅限 SO),以包含在安装过程中。我已经尝试过 EXPORT 关键字,但看起来它只影响我在项目中构建并标记为与库相同EXPORTfoo库。
可能吗?
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, like 等${THRIFT_LIBRARIES}, ${Boost_LIBRARIES} and gRPC::grpc宏化的库

4

2 回答 2

3

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

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

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

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

以下是您的一些可能性:

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

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

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

等等

请参阅新的安装命令

于 2021-07-22T15:25:37.310 回答