使CMake库可以自动访问其他CMake包

ami*_*mir 5 cmake

我有一个产生库的项目:

project (myCoolLibrary)
ADD_LIBRARY(my_cool_library SHARED ${mysources_SRC})
Run Code Online (Sandbox Code Playgroud)

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

find_package (myCoolLibrary REQUIRED)
INCLUDE_DIRECTORIES("${myCoolLibrary_INCLUDE_DIRS}" )
add_executable(myCoolExe ${my_sources_SRC} )
TARGET_LINK_LIBRARIES(myCoolExe ${myCoolLibrary_LIBRARIES} )
Run Code Online (Sandbox Code Playgroud)

有没有办法可以更改第一个文件,以便第二个文件自动运行?通过在第一个文件上运行CMake然后在输出上运行make,然后在第二个文件上运行CMake,CMake能够找到包吗?

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

Flo*_*ian 4

采用@daniperez的博客文章中找到的代码-在 CMake 项目中使用支持 CMake 的库 (III) - 我提出了以下最小解决方案:

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}")
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

为了使其可重用,我将所有内容都打包到了my_export_target(). 我是像INTERFACE_INCLUDE_DIRECTORIES.

正如 @ruslo 所评论的,使用export(PACKAGE ...)可能会污染您的包注册表。因此,您也可以:

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

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

  2. 通过第二个项目的 CMake 命令行设置CMAKE_MODULE_PATH(从外部注入搜索路径)。如果您无论如何都使用构建脚本构建两个项目,那么这是传播模块搜索路径的最直接方法。

附加参考资料