【问题标题】:Making a CMake library accessible by other CMake packages automatically使其他 CMake 包自动访问 CMake 库
【发布时间】:2015-11-01 12:35:48
【问题描述】:

我有一个生成库的项目:

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

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

【问题讨论】:

  • DevSolar,我读过那篇文章。老实说,我觉得它有点太复杂了,我不喜欢。我希望有一个更简单的方法。另外,如果我是对的,我必须运行“make install”才能让它工作,尽管这很有意义。
  • 同一篇文章指出another article是一个较新的解决方案。我会试试这个,看看会发生什么。
  • 只是一个提示:可以在 daniperez 的博客文章中找到更简洁的描述:Use CMake-enabled libraries in your CMake project (III)
  • @Florian 这是最终奏效的,也是我想要的。我必须解决这个问题以正确反映我想要的。另外,如果您写了一个解决方案,我会将其标记为答案,否则我将在几天内自己完成。谢谢。

标签: cmake


【解决方案1】:

采用@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 module0003659: FIND_PACKAGE command improvements

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

其他参考资料

【讨论】:

  • @ruslo 感谢您的反馈。我会相应地检查并更新我的答案。
  • 这似乎是一个很好的开始,但我无法修改它以正确传递传递库依赖项。我尝试导出的库依赖于另一个库(及其头文件),我无法将这些内容添加到我的包的正确链接/包含信息中。任何想法应该如何工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多