OpenCV 3.x是否有可用C接口?Win10下MinGW编译遇错误求助
咱们一步步拆解你的问题——这是典型的链接阶段错误,再加上OpenCV 3.x对C API的一些调整导致的,别着急,我帮你理清:
问题根源分析
首先,你遇到的undefined reference to cvRound是链接阶段错误,不是编译阶段的问题。看你给出的gcc命令里有-c参数,这个参数的作用是只编译生成目标文件(.o),不进行链接操作——你的编译过程根本没尝试链接OpenCV的库文件,自然找不到cvRound的实现。
另外,OpenCV 3.x并没有完全取消C语言支持,但确实对C API的结构做了调整:
- 原有的C API函数被归类到特定的模块库中,比如
cvRound属于imgproc模块的C接口 - OpenCV 3.x的C库命名规则是
libopencv_<模块名><版本号>.a(静态库)或libopencv_<模块名><版本号>.dll.a(动态库导入库),比如3.4.0版本的imgproc库就是libopencv_imgproc340.a
解决步骤
1. 修正Eclipse项目的链接器配置(核心)
你只配置了头文件路径,还需要在链接器设置里补充OpenCV的库信息:
- 打开Eclipse项目属性 → C/C++ Build → Settings → GCC C Linker
- 在**Library search path (-L)**里添加OpenCV的lib目录,比如
C:\opencv\MinGW_build\install\x86\mingw\lib(路径要和你编译安装的OpenCV实际位置一致) - 在**Libraries (-l)**里添加需要的库:
- 至少要加
opencv_core340和opencv_imgproc340(把340换成你实际的OpenCV 3.4.x版本号,比如341对应3.4.1) - 如果用到图像读写等其他功能,还要补充
opencv_imgcodecs340这类对应模块的库
- 至少要加
- 如果你编译OpenCV时开启了
BUILD_opencv_world选项,只需要添加opencv_world340一个库即可,它打包了所有模块的功能
- 在**Library search path (-L)**里添加OpenCV的lib目录,比如
2. 手动编译链接的命令示例
如果不用Eclipse自动构建,手动执行命令的话可以分两步:
第一步:编译生成目标文件(保留-c参数)
gcc "-IC:\\opencv\\MinGW_build\\install\\include" "-IC:\\opencv\\MinGW_build\\install\\include\\opencv2" "-IC:\\opencv\\MinGW_build\\install\\include\\opencv" -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\opencv_c_testproject.o" "..\\src\\opencv_c_testproject.c"
第二步:链接生成可执行文件(去掉-c,添加库路径和库)
gcc -o "opencv_c_testproject.exe" "src\\opencv_c_testproject.o" "-LC:\\opencv\\MinGW_build\\install\\x86\\mingw\\lib" -lopencv_core340 -lopencv_imgproc340
3. 优化C API的头文件引用
纯C项目中,建议直接包含顶层的C头文件,避免单独引入子模块头文件可能带来的遗漏:
#include <opencv/cv.h> #include <opencv/highgui.h>
为什么C++项目能正常运行?
因为你配置C项目时,不仅加了头文件路径,还正确配置了链接器的库路径和库文件——OpenCV的C接口和C接口共用一套库,只是头文件不同,所以C++项目能正常链接到库实现。
内容的提问来源于stack exchange,提问作者OBu
相关产品推荐
相关产品推荐

