【问题标题】:find_package() ignores <PackageName>_ROOTfind_package() 忽略 <PackageName>_ROOT
【发布时间】:2022-09-29 02:21:56
【问题描述】:

在我的 CMake 脚本中,我将路径附加到包含 &lt;PackageName&gt;Config.cmake&lt;PackageName&gt;_ROOT 的文件夹中,然后调用 find_package(&lt;PackageName&gt; REQUIRED) 但它找不到我的包。

当我使用CMAKE_FIND_DEBUG_MODE 时,我看到我的文件夹在&lt;PackageName&gt;_ROOT CMake variable [CMAKE_FIND_USE_PACKAGE_ROOT_PATH] 中列出(它实际上是那里唯一的文件夹),但它没有在find_package considered the following locations for the Config module: 之后列出。

为什么我会出现这种行为?我使用来自 Android Studio 的 CMake 3.18.1。我试图找到的包是 OpenCV。


相对于我的CMakeLists.txt 文件,OpenCV 安装在../../build/opencv-build&lt;custom suffix&gt; 中,所以我找到它的代码是:

get_filename_component(OPENCV_BUILD_DIRS_ROOT ../../build REALPATH)
file(GLOB OPENCV_BUILD_DIRS ${OPENCV_BUILD_DIRS_ROOT}/opencv-build*)
list(APPEND OpenCV_ROOT ${OPENCV_BUILD_DIRS})

find_package(OpenCV ${OPENCV_VERSION} REQUIRED ${OPENCV_PUBLIC_LIBRARIES} ${OPENCV_PRIVATE_LIBRARIES})

当我在 Linux(实际上是 WSL)上运行它时,一切正常,CMake 在../../build/opencv-build(或绝对路径形式的&lt;project path&gt;/build/opencv-build)中成功找到了 OpenCV。

但是当我尝试从 Android Studio 构建项目时,它没有,我从CMAKE_FIND_DEBUG_MODE 得到这个输出:

CMake Debug Log at external/opencv/CMakeLists.txt:12 (find_package):
  find_package considered the following paths for OpenCV.cmake

    C:/Users/<username>/AppData/Local/Android/Sdk/cmake/3.18.1/share/cmake-3.18/Modules/FindOpenCV.cmake

  The file was not found.

  <PackageName>_ROOT CMake variable [CMAKE_FIND_USE_PACKAGE_ROOT_PATH].

    <project path>/build/opencv-build

  

  CMAKE_PREFIX_PATH variable [CMAKE_FIND_USE_CMAKE_PATH].

    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64

  

  CMAKE_FRAMEWORK_PATH and CMAKE_APPBUNDLE_PATH variables
  [CMAKE_FIND_USE_CMAKE_PATH].

  

  Env variable OpenCV_DIR [CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH].

    none

  CMAKE_PREFIX_PATH env variable [CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH].

    none

  CMAKE_FRAMEWORK_PATH and CMAKE_APPBUNDLE_PATH env variables
  [CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH].

    none

  Paths specified by the find_package HINTS option.

    none

  Standard system environment variables
  [CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH].

    <a lot of unrelated directories>

  

  CMake User Package Registry [CMAKE_FIND_USE_PACKAGE_REGISTRY].

    none

  CMake variables defined in the Platform file
  [CMAKE_FIND_USE_CMAKE_SYSTEM_PATH].

    C:/Users/<username>/AppData/Local/Android/Sdk/cmake/3.18.1
    <other unrelated directories>

  

  CMake System Package Registry
  [CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY].

    none

  Paths specified by the find_package PATHS option.

    none

  find_package considered the following locations for the Config module:

    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/OpenCVConfig.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/opencv-config.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/OpenCVConfig.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/opencv-config.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android/21/OpenCVConfig.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android/21/opencv-config.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/local/OpenCVConfig.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/local/opencv-config.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/OpenCVConfig.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/opencv-config.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot/OpenCVConfig.cmake
    C:/Users/<username>/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot/opencv-config.cmake

  The file was not found.
  • 这需要调试细节。至少需要 CMakeLists.txt 以及您运行的命令。可能还有 OpenCV 版本和安装方法。
  • @AlexReinking 更新了问题,提供了更多数据。整个 CMake 项目很大,所以我只是粘贴了相关部分。 OpenCV 是从头开始构建的。

标签: c++ opencv cmake build find-package


【解决方案1】:

所以,问题实际上是对于Android(可能还有iOS)CMake将CMAKE_FIND_ROOT_PATH_MODE_PACKAGE变量(和其他CMAKE_FIND_ROOT_PATH_MODE_*变量)设置为ONLY,这使得find_package(和其他find_*函数)前缀路径与CMAKE_FIND_ROOT_PATH 列表中的内容。

要覆盖这一点,可以执行以下一些操作:

  • CMAKE_FIND_ROOT_PATH_MODE_* 设置为BOTHNEVER
  • 对每个find_* 调用使用CMAKE_FIND_ROOT_PATH_BOTHNO_CMAKE_FIND_ROOT_PATH

当 CMake 忽略来自 HINTSPATHS 和其他前缀构造步骤的路径时,它还应该解决问题。

【讨论】:

    【解决方案2】:

    由于您提供的是配置文件,因此您应该将&lt;PackageName&gt;_DIR 设置为您拥有配置的位置,而不是&lt;PackageName&gt;_ROOT(这是查找模块的提示,当您有配置路径时并不真正需要)。


    如果您不确切知道路径,或者想要使用多个路径,您应该咨询docs 关于搜索过程,因为有多种方法可以影响 CMake 搜索配置文件的位置(包括 &lt;PackageName&gt;_ROOT、@ 987654325@、CMAKE_PREFIX_PATH 等)。

    但是,如果默认情况下无法找到您的配置,并且您仍然需要提示,我看不出有任何理由为什么您不能只设置 &lt;PackageName&gt;_DIR 变量。你知道你想要什么包,你知道它在哪里,它是一个单一的路径,没有理由使用任何其他变量。

    唯一的原因可能是,如果您有一个包含许多库的预期文件夹结构,但此树不在默认位置,在这种情况下,我会修改 CMAKE_PREFIX_PATH,因为只需进行一次修改,您就可以获得找到的所有库。

    【讨论】:

    • 但为什么会这样呢? find_package 文档在“配置模式搜索过程”下指定 &lt;PackageName&gt;_DIR。如果我使用&lt;PackageName&gt;_DIR,我只能将其设置到一个特定位置,甚至不能设置前缀。如果我需要指定多个可能的位置,我应该怎么做?
    • @Eyjafl 看到更新
    • 我用添加调试日志的更多详细信息更新了问题。我尝试将我的路径附加到CMAKE_PREFIX_PATH,但无济于事:考虑的位置列表由于某种原因保持不变,即使CMAKE_PREFIX_PATH 现在列出了我的 OpenCV 目录。是的,如果我将路径硬编码为OpenCV_DIR,它工作正常,但我正在使用 Android,这需要为不同的 ABI 安装多个 OpenCV,为此我使用修改后问题中指定的不同后缀,因此需要多个目录.
    • @Eyjafl 为什么CMAKE_PREFIX_PATH 没有给你想要的结果很难找到没有实际调试的结果,所以你必须通过比较 CMake 的期望(它在那里,通过我提供的链接)与什么来找到它你实际上在你的文件夹中。此外,我给您的链接需要配置搜索,而您当前的 find_package 不是,因此您需要确保使用 find_package(OpenCV CONFIG ...) 使用该方法。另外我还是不明白为什么你不能使用OpenCV_DIR。您有 3 个不同的版本,但您在任何时候都只能找到一个,因此请使用正确的后缀...
    • ...根据您现在使用的库设置OpenCV_DIR。我看不出它与设置多个搜索目录有何不同。无论如何,找出为什么CMAKE_PREFIX_PATH 对你不起作用也是有教育意义的,所以也许你应该坚持下去。
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多