使cmake库可以被其他cmake软件包自动访问

我有一个项目可以生成一个库:

project (myCoolLibrary) ADD_LIBRARY(my_cool_library SHARED ${mysources_SRC}) 

另一个应该使用这个库的项目:

 find_package (myCoolLibrary REQUIRED) INCLUDE_DIRECTORIES("${myCoolLibrary_INCLUDE_DIRS}" ) add_executable(myCoolExe ${my_sources_SRC} ) TARGET_LINK_LIBRARIES(myCoolExe ${myCoolLibrary_LIBRARIES} ) 

有没有办法,我可以改变第一个文件,以便第二个文件自动工作? 通过在第一个文件上运行cmake然后在输出上运行make,然后在第二个文件上运行cmake,cmake是否能够find包?

我只是把第一个项目的构build地址提供给第二个包的答案也是可以接受的。

把我的评论变成一个答案

在@daniperez的博客文章中find代码 – 在CMake项目中使用CMake启用的库(III) – 我想出了以下最小的解决scheme:

myCoolLibrary /的CMakeLists.txt

 cmake_minimum_required(VERSION 3.3) project(myCoolLibrary) function(my_export_target _target _include_dir) file( WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Config.cmake" " include(\"\$\{CMAKE_CURRENT_LIST_DIR\}/${_target}Targets.cmake\") set_property( TARGET ${_target} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES \"${_include_dir}\" ) " ) export(TARGETS ${_target} FILE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Targets.cmake") # NOTE: The following call can pollute your PC's CMake package registry # See comments/alternatives below export(PACKAGE ${_target}) endfunction(my_export_target) ... add_library(${PROJECT_NAME} SHARED ${mysources_SRC}) my_export_target(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}") 

myCoolExe /的CMakeLists.txt

 cmake_minimum_required(VERSION 3.3) project(myCoolExe) find_package(myCoolLibrary REQUIRED) ... add_executable(${PROJECT_NAME} ${my_sources_SRC}) target_link_libraries(${PROJECT_NAME} myCoolLibrary) 

为了使它可重用,我把所有的东西都打包到了my_export_target() 。 我是INTERFACE_INCLUDE_DIRECTORIES类的自我传播属性的朋友。

编辑 :由@ruslo使用export(PACKAGE ...)可以污染你的包registry。 所以或者你可以:

  1. 将目标configuration文件直接写入某个特定工具链的专用位置

    请参阅如何安装自定义CMake-Find模块和0003659:FIND_PACKAGE命令改进

  2. 通过第二个项目的CMake命令行设置CMAKE_MODULE_PATH (从外部注入searchpath)。 如果您正在使用构build脚本构build两个项目,那么这是传播模块searchpath的最直接的方法。

其他参考

  • 出口()
  • CMake /教程/包registry
  • 无法find与CMake Eigen3
  • 如何指示CMake使用构build体系结构编译器?