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

时间:2016-03-15 18:53:11

标签: 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。 正如你所看到的那样,似乎做了完美的工作,但它抱怨外部先决条件"。我个人认为这是正常的,我不明白如何解决这个问题。 (注意:在失败之前成功找到并将依赖项复制到同一文件夹中,Doc:https://cmake.org/cmake/help/v3.5/module/BundleUtilities.html

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

  3. 谢谢,

1 个答案:

答案 0 :(得分:0)

我个人将使用add_library(MyLibrary1 STATIC/SHARED/INTERFACE)从您所有的依赖关系中创建一个库,并可能最有可能促进add_library(boost INTERFACE),然后添加任何包含目录并链接.a或{{1 }}。

然后,如上所述,我将所有依赖项链接到.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)