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

时间:2015-11-01 12:35:48

标签: 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能够找到包吗?

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

1 个答案:

答案 0 :(得分:3)

通过@daniperez - Use CMake-enabled libraries in your CMake project (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}")

<强> 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 ...)会污染您的包注册表。所以,你也可以:

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

    参见例如 How to install your custom CMake-Find module 0003659: FIND_PACKAGE command improvements

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

  3. 其他参考资料