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

时间:2018-08-30 13:19:01

标签: c++ cmake vcpkg

我的目标使用TARGET_LINK_LIBRARIESPUBLIC关键字与多个库链接,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

2 个答案:

答案 0 :(得分:2)

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

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

new Install command

答案 1 :(得分:1)

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

只需考虑传递依赖项(我不知道这是否是正确的词),例如:您的libA依赖于libB,而依赖于libC。 CMake应该如何从仅列出libB的CMakeList中获得此信息?

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

您知道,有一些非常棘手的事情需要考虑。

以下是您的一些可能性:

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