CMAKE:如何安装目标的依赖项

Hev*_*evy 8 c++ cmake

我正在尝试使用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})
Run Code Online (Sandbox Code Playgroud)

最后,我想找到这种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是一个较低级别的函数,允许您获取依赖项.问题是,我没有任何好方法/最佳实践来使用它.

谢谢,

Cas*_*des 0

我个人会用所有依赖项创建一个库,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
)
Run Code Online (Sandbox Code Playgroud)

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

function(INSTALL_CUSTOM target
  install(TARGETS target
   ARCHIVE DESTINATION lib
   LIBRARY DESTINATION lib
   RUNTIME DESTINATION bin
   COMPONENT target
  )
endfunction()
Run Code Online (Sandbox Code Playgroud)

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