gpt4 book ai didi

cmake - FooTarget.cmake 和 FindFoo.cmake 的区别?

转载 作者:行者123 更新时间:2023-12-04 10:59:54 31 4
gpt4 key购买 nike

CMake 自动创建一个 FooTarget.cmake文件例如添加

install(EXPORT FooTargets
FILE FooTargets.cmake
NAMESPACE Foo::
DESTINATION lib/cmake/Foo
)

CMakeLists.txt一个名为 Foo 的库。 FooTargets.cmake有什么区别和 FindFoo.cmake ?使用上面的代码片段, FooTarget.cmake通过运行 sudo make install 自动安装在构建目录中。

但是,似乎在 find_package(Foo) 中不一定能找到这样的库。 .这有什么意义 FooTarget.cmake文件,如果它不会使库自动发现?由于库是由 CMake 生成的,因此 CMake 本身似乎应该知道如何生成 FindFoo.cmake库,使库可以被其他使用 CMake 的项目自动发现,并将其放在平台上应放在的位置。

最佳答案

使用 find_package(Foo) 发现包包括两个步骤:

  • 使用 predefined algorithm , find_package定位脚本 FooConfig.cmake描述包裹 Foo .
  • 脚本FooConfig.cmake由 CMake 在主项目(调用 find_package)的上下文中处理。

    此脚本设置变量和/或 IMPORTED 目标,主项目可以进一步使用这些目标。

  • 脚本 FooTarget.cmake由 CMake 生成有助于第二步。此脚本旨在(与 include() 一起)包含到 FooConfig.cmake 中.当 FooTarget.cmake由 CMake 处理,它创建 IMPORTED 目标并设置它们的属性。

    所以,非常基本的 FooConfig.cmake脚本只包含一行:
    include("${CMAKE_CURRENT_LIST_DIR}/FooTarget.cmake")

    并使用 install(FILES) 安装进入 find_package所在的目录可以找到脚本(目录 lib/cmake/Foo 非常适合此目的)。

    这么简单的内容 FooConfig.cmake脚本暗示它安装在 FooTarget.cmake 附近脚本包含在其中。

    更复杂的 FooConfig.cmake脚本可以检查包版本(带有请求的版本),解释 COMPONENTS find_package 的请求,定义主项目可用的函数/宏等等。该脚本的示例可以在 CMake documentation 中找到。 .

    关于cmake - FooTarget.cmake 和 FindFoo.cmake 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58882018/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com