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

查看:97
本文介绍了使其他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项目(III)中使用已启用CMake的库 -我'提出了以下最小解决方案:

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命令改进

See e.g. How to install your custom CMake-Find module and 0003659: FIND_PACKAGE command improvements.

设置 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).

其他参考

  • export()
  • CMake/Tutorials/Package Registry
  • Unable to find Eigen3 with CMake
  • How to instruct CMake to use the build architecture compiler

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

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