引入opencv2/objdetect.hpp后遇‘CV_WRAP_FILE_PATH未声明’错误求助
问题:引入opencv2/objdetect.hpp后出现CV_WRAP_FILE_PATH未定义编译错误
编译错误信息
/usr/include/opencv2/objdetect/face.hpp:85:47: error: ‘CV_WRAP_FILE_PATH’ has not been declared 85 | CV_WRAP static Ptr create(CV_WRAP_FILE_PATH const String& model, | ^~~~~~~~~~~~~~~~~ /usr/include/opencv2/objdetect/face.hpp:85:77: error: expected ‘,’ or ‘…’ before ‘&’ token 85 | CV_WRAP static Ptr create(CV_WRAP_FILE_PATH const String& model, | ^ In file included from /usr/include/opencv2/objdetect.hpp:869, from /home/zero/openCV/chip_phytium/with_opencv/include/cv_zone.h:5, from /home/zero/openCV/chip_phytium/with_opencv/src/cv_zone_chapter2_3_4.cpp:1: /usr/include/opencv2/objdetect/face.hpp:157:49: error: ‘CV_WRAP_FILE_PATH’ has not been declared 157 | CV_WRAP static Ptr create(CV_WRAP_FILE_PATH const String& model, CV_WRAP_FILE_PATH const String& config, int backend_id = 0, int target_id = 0); | ^~~~~~~~~~~~~~~~~ /usr/include/opencv2/objdetect/face.hpp:157:79: error: expected ‘,’ or ‘…’ before ‘&’ token 157 | CV_WRAP static Ptr create(CV_WRAP_FILE_PATH const String& model, CV_WRAP_FILE_PATH const String& config, int backend_id = 0, int target_id = 0);
检查cvdef.h结果
当前系统中的cvdef.h未包含CV_WRAP_FILE_PATH定义,仅存在以下宏:
#define CV_WRAP #define CV_WRAP_AS(synonym) #define CV_WRAP_MAPPABLE(mappable) #define CV_WRAP_PHANTOM(phantom_header) #define CV_WRAP_DEFAULT(val)
相关代码
main.cpp
#include <opencv2/core/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/opencv.hpp> #include "opencv2/objdetect.hpp" void cv_zone_face_detection() { string path = "../peripheral/cv_zone/Resources/test.png"; Mat img = imread(path); // CascadeClassifier face_cascade; // face_cascade.load("../peripheral/cv_zone/Resources/haarcascade_frontalface_default.xml"); // if (face_cascade.empty()) { // cout << "Cascade file not loaded" << endl; // } imshow("Image", img); waitKey(0); }
CMakeLists.txt
cmake_minimum_required(VERSION 3.16.3) Project(opencv_SDK_phytium) option(RUNNING_OPENCV "Build with OpenCV" ON) if(DEFINED RUNNING_OPENCV) if(RUNNING_OPENCV) message("Build with OpenCV") find_package(OpenCV REQUIRED) #opencv 官方库文件 include_directories(${OpenCV_INCLUDE_DIRS}) #自定义文件 include_directories(with_opencv/include) aux_source_directory (with_opencv/src SRC_LIST) else() message("Build without OpenCV") ADD_DEFINITIONS(-DCLOSE_OPENCV) endif() endif() set(CMAKE_THREAD_LIBS_INIT "-lpthread") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") set(CMAKE_HAVE_THREADS_LIBRARY 1) set(CMAKE_USE_WIN32_THREADS_INIT 0) set(CMAKE_USE_PTHREADS_INIT 1) set(THREADS_PREFER_PTHREAD_FLAG ON) include_directories(include) aux_source_directory (src SRC_LIST) add_executable(vedio_opencv main.cpp ${SRC_LIST}) if(RUNNING_OPENCV) target_link_libraries(vedio_opencv ${OpenCV_LIBS}) endif()
用户疑问
- 是否因安装OpenCV时未包含Java模块导致该错误?
- 能否自动生成该宏定义?
解决方案
- 原因确认:
CV_WRAP_FILE_PATH是OpenCV为Java/Python等语言绑定提供的注解宏,当编译OpenCV时未启用BUILD_JAVA或BUILD_opencv_java模块,这个宏不会被写入cvdef.h,但相关头文件(如face.hpp)仍会引用它,从而触发编译错误。你的猜测是正确的。 - 快速临时修复:在引入任何OpenCV头文件之前,手动定义这个空宏即可解决问题:
该宏在非语言绑定场景下仅作为标记使用,空定义完全不影响功能。#define CV_WRAP_FILE_PATH #include <opencv2/opencv.hpp> // 其他代码 - 彻底修复方案:
- 重新编译OpenCV,在CMake配置阶段启用
BUILD_JAVA选项,确保头文件生成时包含该宏定义; - 检查当前安装的OpenCV是否存在头文件与库文件版本/编译配置不匹配的情况,若存在则重新安装一致的版本。
- 重新编译OpenCV,在CMake配置阶段启用
- 额外优化:代码中已引入
<opencv2/opencv.hpp>,该头文件已包含objdetect.hpp,可删除单独的#include "opencv2/objdetect.hpp",避免重复引入潜在问题。
内容的提问来源于stack exchange,提问作者MingZi Jia
相关产品推荐
相关产品推荐

