gpt4 book ai didi

c++ - CMake 和 FIND_PACKAGE

转载 作者:行者123 更新时间:2023-11-30 01:34:01 27 4
gpt4 key购买 nike

确保 cmake 仅从特定根目录中查找库和 header 的最佳方法是什么。

假设:

  • 我们只想查看特定目录(例如:/mysdkroot/)
  • 我们要忽略所有不在特定目录中的文件(例如,不应使用/usr/lib 或/usr/include,只能使用/mysdkroot/)
  • 使用库提供的 find_package() 功能,而不是在我们的 cmake 上特定查找文件或 header
  • 我们不编辑库制作者提供的 FindXXX.cmake 或 xxxConfig.cmake
  • 重要我不想编辑每个指定搜索路径的查找包/文件/lib 调用

我可以使用 NO_DEFAULT_PATH 并指定查找路径来完成其中一半,但我无法对此提供完整的证明解决方案,因为我始终依赖 FindXXX.cmake 或 xxxConfig.cmake 的实现方式。例如,如果调试/发布文件有不同的名称,例如在我的/mysdkroot/中,我只有调试文件,而在系统中只有发布存在,那么对于某些库,它可能会首先找到发布,而不是首先找到调试和其他问题,因为我无法将搜索范围缩小到该文件夹​​。

最佳答案

NO_DEFAULT_PATH 是一个好的开始。但是,我会启用一种查找包的方法,那就是使用 CMAKE_PREFIX_PATH:

NO_PACKAGE_ROOT_PATH
NO_CMAKE_ENVIRONMENT_PATH
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_PACKAGE_REGISTRY
NO_CMAKE_SYSTEM_PATH
NO_CMAKE_SYSTEM_PACKAGE_REGISTRY

除了 CMAKE_PREFIX_PATH 中指定的路径外,这将禁用它们。

然后将您的前缀路径设置为您的 sdk:

set(CMAKE_PREFIX_PATH "/mysdkroot")

那么,实际上你仍然依赖于那些 findXXX.cmake 和那些 XXX-config.cmake 是如何实现的。幸运的是,您可以使用命令多态性完全改变它们的行为:

set(current-find-package "")

function(find_package)
set(current-find-package "${ARGV1}")
# The leading underscore mean the original command
_find_package(${ARGV})
endfunction()

# function usually used in findXX.cmake modules
function(find_library)
if("${current-find-package}" STREQUAL "SomePakage")
# TODO: remove unwanted paths in ARGV
_find_library(${ARGV} NO_DEFAULT_PATH)
endif()
endfunction()

虽然这可行,但我建议不要滥用它或非常小心使用它。您不希望引入令人惊讶的行为。


您主要关心的是 XX-config.cmakefindXX.cmake 试图在您的 SDK 路径之外查找库。

首先,XX-config.cmake 通常表现正确。如果找到 XX-config.cmake,它不会尝试查找路径外的库。它已经知道在哪里可以找到这些库。

然后,您的 FindXX.cmake 可能会出现错误,因为它们主要是在不同的 cmake 时代手工编写的。

我的建议是替换不符合您要求的模块。只需提供您自己的行为正确的自定义 FindXX.cmake 模块。如果维护者提供的工具不能满足您的要求,请不要使用它们,只需提供您自己的工具即可。

关于c++ - CMake 和 FIND_PACKAGE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57056869/

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