使其他 CMake 包自动访问 CMake 库 [英] Making a CMake library accessible by other CMake packages automatically

查看:32
本文介绍了使其他 CMake 包自动访问 CMake 库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个生成库的项目:

I have one project that produces a library:

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

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

And another project that should be using this library:

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 能够找到包?

Is there a way that I can change the first file so that the second file works automatically? That by running CMake on the first file and then running make on the output, then running CMake on the second file, CMake is able to find the package?

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

An answer where I just give the address of where the first project is built to the second package is also acceptable.

推荐答案

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

Taking the code found in a blog post by @daniperez - Use CMake-enabled libraries in your CMake project (III) - I've come up with the following minimal solution:

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.

To make it reusable I have packed everything into my_export_target(). And I'm friend of self-propagating properties like INTERFACE_INCLUDE_DIRECTORIES.

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

As commented by @ruslo, using export(PACKAGE ...) can pollute your package registry. So alternatively you can:

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

  1. Write the target configuration files directly to some dedicated place specific for a certain toolchain

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

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

Set CMAKE_MODULE_PATH via the second project's CMake command line (injecting the search path(s) from the outside). If you are building the two projects anyway with a build script, then this is the most direct way to propagate the module search path(s).

其他参考资料

这篇关于使其他 CMake 包自动访问 CMake 库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆