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

标签 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})

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

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

  1. BundleUtilities.cmake,这里是一个例子:https://cmake.org/Wiki/BundleUtilitiesExample . 如您所见,它似乎做得很完美,但它提示“外部先决条件”。我个人认为这很正常,但我不知道如何解决。 (注意:在失败前成功找到依赖并将其复制到同一文件夹中,文档:https://cmake.org/cmake/help/v3.5/module/BundleUtilities.html)

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

谢谢,

最佳答案

我个人会使用 add_library(MyLibrary1 STATIC/SHARED/INTERFACE) 从您的所有依赖项中创建一个库,对于 boost 最有可能是 add_library(boost INTERFACE) 随后通过添加任何包含目录并将 .a.so 链接到它们。

然后我会像上面那样将我所有的依赖项链接到 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)

关于c++ - CMAKE:如何安装目标的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36019738/

相关文章:

c++ - 为什么将树存储为连续的内存块?

c++ - 将图像从 URL 加载到变量/opencv Mat

64-bit - 使用CMake编译32位和64位项目

c++ - 如果您所做的只是等待它完成,为什么要使用异步?

c++ - 使用枚举编译时多态性

xcode - 通过 CMake 添加 Xcode 构建阶段

c++ - CMakeLists.txt 不会创建可用的 makefile(Ubuntu 和 C++)

Qt Creator 无法在 OSX 中打开 CMake C++ 项目

c++ - 查找最长的有效括号(leetcode)

cmake - 如何在 CMakeLists.txt 中禁用 CPACK_PACKAGE_VERSION_PATCH?