【问题标题】:CMAKE: How to install the dependencies of a targetCMAKE:如何安装目标的依赖项
【发布时间】:2016-07-01 09:24:32
【问题描述】:

我正在尝试使用 cmake 安装可执行文件。我真正的问题是:如何安装可执行文件及其依赖项。

这里是一个例子: 我想安装一个依赖于我的 cmake 的两个库和一个 3rdparty(预编译)的可执行文件。

set(EXECUTABLE_NAME MyExecutable)
file(GLOB_RECURSE ${EXECUTABLE_NAME}_SOURCES *.cpp)    
add_executable(${EXECUTABLE_NAME} ${${EXECUTABLE_NAME}_SOURCES})
target_link_libraries(${EXECUTABLE_NAME} MyLibrary1
  MyLibrary2
  ${Boost_PROGRAM_OPTIONS_LIBRARY})
install(TARGETS ${EXECUTABLE_NAME}
 ARCHIVE DESTINATION lib
 LIBRARY DESTINATION lib
 RUNTIME DESTINATION bin
 COMPONENT ${EXECUTABLE_NAME})

最后我想用这种 CMakeLists.txt 在安装文件夹和包中找到我的两个库,我的可执行文件和 Boost_PROGRAM_OPTIONS_LIBRARY。

找到了,但是没有成功使用:

  1. BundleUtilities.cmake,这里是一个例子:https://cmake.org/Wiki/BundleUtilitiesExample。 如您所见,它似乎完成了完美的工作,但它抱怨“外部先决条件”。我个人觉得这很正常,我不明白如何解决这个问题。 (注:在失败前成功找到并复制依赖到同一个文件夹,Doc:https://cmake.org/cmake/help/v3.5/module/BundleUtilities.html

  2. GetPrerequisites.cmake。 get_prerequisites 是一个较低级别的函数,允许您获取依赖项。问题是,我没有任何好的方法/最佳实践来使用它。

谢谢,

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    我个人会用add_library(MyLibrary1 STATIC/SHARED/INTERFACE) 和最可能的add_library(boost INTERFACE) 将所有依赖项创建一个库,然后添加任何包含目录并将.as 或.sos 链接到它们。

    然后我会将我的所有依赖项链接到MyExecutable,就像你上面所说的那样。您可以在任何时候对所有这些目标调用install 函数。

    如果你不喜欢重复

    install(TARGETS target
     ARCHIVE DESTINATION lib
     LIBRARY DESTINATION lib
     RUNTIME DESTINATION bin
     COMPONENT target
    )
    

    然后你可以把它分解成一个函数,像这样

    function(INSTALL_CUSTOM target
      install(TARGETS target
       ARCHIVE DESTINATION lib
       LIBRARY DESTINATION lib
       RUNTIME DESTINATION bin
       COMPONENT target
      )
    endfunction()
    

    然后你可以打电话给INSTALL_CUSTOM(MyLibrary1)INSTALL_CUSTOM(boost)

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多