OpenCV Android交叉编译中CMAKE_MODULE_PATH配置无效找不到OpenCVConfig.cmake
Android Qt 项目集成 OpenCV 时 CMake 无法识别 OpenCVConfig.cmake
问题场景
在统一使用 NDK r21e 工具链、配置 ANDROID_PLATFORM=28、ANDROID_ABI=arm64-v8a 的前提下,在面向 Android 的 Qt 项目中集成自行编译的 OpenCV 动态库 SDK,无论调整什么路径配置,CMake 都报错找不到 OpenCVConfig.cmake。
已尝试的所有配置:
- 在项目
CMakeLists.txt中往CMAKE_MODULE_PATH、CMAKE_PREFIX_PATH追加 OpenCV 的 jni 目录路径:list (APPEND CMAKE_MODULE_PATH "$ENV{HOME}/CLionProjects/opencv/opencv-android-shared/sdk/native/jni") list (APPEND CMAKE_PREFIX_PATH "...原有路径项" "$ENV{HOME}/CLionProjects/opencv/opencv-android-shared/sdk/native/jni") - 命令行传入编译参数覆盖路径配置:
-DCMAKE_TOOLCHAIN_FILE="/home/dym/Android/Sdk/ndk/android-ndk-r21e/build/cmake/android.toolchain.cmake" -DANDROID_ABI=arm64-v8a -DCMAKE_MODULE_PATH=/home/dym/CLionProjects/opencv/opencv-android-shared/sdk/native/jni - 已配置的 OpenCV 路径参考截图:

对应的 CMake 报错信息:
CMake Error at CMakeLists.txt: 31 (find_package): By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "OpenCV", but CMake did not find one. Could not find a package configuration file provided by "OpenCV" with any of the following names: OpenCVConfig.cmake opencv-config.cmake Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set "OpenCV_DIR" to a directory containing one of the above files. If "OpenCV" provides a separate development package or SDK, be sure it has been installed.
直接有效的解决步骤
- 核对
OpenCVConfig.cmake的实际存放位置
Android 版 OpenCV 编译产出的OpenCVConfig.cmake不会放在sdk/native/jni根目录,而是会按 ABI 分类存放到sdk/native/jni/abi-<对应ABI名称>的子目录下。之前配置的搜索路径比实际文件位置高了一层,CMake 不会递归搜索子目录查找配置文件,自然匹配不到目标文件。 - 纠正路径配置的认知误区
CMAKE_MODULE_PATH的作用是搜索Find<PackageName>.cmake形式的模块脚本,OpenCVConfig.cmake属于包配置文件,对应的搜索逻辑根本不会读取CMAKE_MODULE_PATH下的路径,之前往这个变量里追加的 OpenCV 路径完全起不到作用。 - 采用最直接的配置方式
不需要绕CMAKE_PREFIX_PATH的搜索逻辑,在find_package(OpenCV)调用前强制指定OpenCV_DIR指向实际存放OpenCVConfig.cmake的目录即可:set(OpenCV_DIR "$ENV{HOME}/CLionProjects/opencv/opencv-android-shared/sdk/native/jni/abi-arm64-v8a" CACHE PATH "OpenCV config path" FORCE) find_package(OpenCV REQUIRED) - 清理旧的 CMake 缓存
之前多次失败的配置会被存到项目的CMakeCache.txt里,新的路径配置如果和缓存里的旧值不匹配,会优先读取缓存值,导致修改不生效。删掉项目根目录下的CMakeCache.txt文件和CMakeFiles文件夹后,重新执行CMake配置流程。 - 额外校验点
确认编译 OpenCV 时设置的 ABI 参数确实生成了abi-arm64-v8a子目录下的配置文件,没有因为编译参数漏配,导致对应 ABI 的OpenCVConfig.cmake没有生成。
内容的提问来源于stack exchange,提问作者Spaghetti Man
相关产品推荐
相关产品推荐

