Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使其他CMake软件包可以自动访问CMake库_Cmake - Fatal编程技术网

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

使其他CMake软件包可以自动访问CMake库,cmake,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_L

我有一个生成库的项目:

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


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

根据博客文章中的代码--我提出了以下最低限度的解决方案:

mycollibrary/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}")
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)
mycolexe/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}")
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)
为了使其可重用,我已将所有内容打包到我的导出目标()中。。我是自传播性质的朋友,比如

正如@ruslo所评论的,使用
导出(包…
会污染包注册表。因此,你也可以:

  • 将目标配置文件直接写入特定工具链的特定位置

    参见例如和

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

  • 其他参考资料


    什么?DevSolar,我读过那篇文章。老实说,我觉得它有点太复杂了,我不喜欢。我希望有一个更简单的方法。此外,如果我是对的,我必须运行“makeinstall”才能让它工作,尽管这是有意义的。我会尝试一下,看看会发生什么。只是一个提示:可以在daniperez的一篇博文中找到一个更简洁的描述:。@Florian这是一个最终奏效的,这是我想要的。我必须修正这个问题,以正确反映我想要的。另外,如果你写了一个解决方案,我会把它标记为答案,如果不是,我会在几天内自己做。谢谢。@ruslo谢谢你的反馈。我将检查并相应地更新我的答案。这似乎是一个很好的开始,但我在修改它以正确传递可传递的库依赖项时遇到了困难。我试图导出的库依赖于另一个库(及其头文件),我无法将这些内容添加到包的正确链接/包含信息中。你知道该怎么做吗?