OpenCV 3.4.20中C语言cvSaveImage等函数编译链接错误求助
问题描述
为项目学习使用OpenCV,因代码基于C语言,选择了包含废弃C头文件的OpenCV 3.4.20版本,编写了如下复制图片的C代码:
#include<stdio.h> #include "opencv/opencv/include/opencv/cv.h" #include "opencv/opencv/include/opencv/highgui.h" #include "opencv/opencv/include/opencv/cxcore.h" void convertToGray(const char* inputImagePath, const char* outputImagePath) { IplImage* inputImage = cvLoadImage(inputImagePath, 3); if (!inputImage) { printf("Error: Unable to load input image.\n"); return; } if (!cvSaveImage(outputImagePath, inputImage)) { printf("Error: Unable to save output image.\n"); } cvReleaseImage(&inputImage); } int main() { convertToGray("baboon.jpg", "baboon_grey.jpg"); return 0; }
使用的CMake配置如下:
cmake_minimum_required(VERSION 2.8) project( jpg ) find_package( OpenCV REQUIRED ) add_executable( jpg jpg.c ) target_link_libraries( jpg ${OpenCV_LIBS} )
编译时出现如下错误:
user@walldm48:~/Desktop/Projet_Diplome$ make Consolidate compiler generated dependencies of target jpg [ 50%] Building C object CMakeFiles/jpg.dir/jpg.c.o /home/user/Desktop/Projet_Diplome/jpg.c: In function ‘convertToGray’: /home/user/Desktop/Projet_Diplome/jpg.c:9:28: warning: implicit declaration of function ‘cvLoadImage’; did you mean ‘cvCloneImage’? [-Wimplicit-function-declaration] 9 | IplImage* inputImage = cvLoadImage(inputImagePath, 3); | ^~~~~~~~~~~ | cvCloneImage /home/user/Desktop/Projet_Diplome/jpg.c:9:28: warning: initialization of ‘IplImage *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion] /home/user/Desktop/Projet_Diplome/jpg.c:19:10: warning: implicit declaration of function ‘cvSaveImage’; did you mean ‘cvShowImage’? [-Wimplicit-function-declaration] 19 | if (!cvSaveImage(outputImagePath, inputImage)) { | ^~~~~~~~~~~ | cvShowImage [100%] Linking C executable jpg /usr/bin/ld: CMakeFiles/jpg.dir/jpg.c.o: in function `convertToGray': jpg.c:(.text+0x1514): undefined reference to `cvLoadImage' /usr/bin/ld: jpg.c:(.text+0x154c): undefined reference to `cvSaveImage' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/jpg.dir/build.make:112: jpg] Error 1 make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/jpg.dir/all] Error 2 make: *** [Makefile:91: all] Error 2
请问哪里操作有误?
解决方法
你的问题核心是头文件路径错误导致编译器无法识别OpenCV C API的函数声明,进而引发链接阶段的符号未定义错误。具体修正步骤如下:
1. 修正头文件引用路径
你手动写的嵌套路径"opencv/opencv/include/opencv/cv.h"完全多余,CMake通过find_package(OpenCV REQUIRED)已经自动将OpenCV的include目录添加到编译路径中,直接使用标准尖括号引用头文件即可:
#include<stdio.h> #include <opencv/cv.h> #include <opencv/highgui.h> #include <opencv/cxcore.h>
2. 明确指定OpenCV依赖模块
虽然原有CMake配置逻辑正确,但可以明确指定C API所需的核心模块,避免自动链接遗漏:
cmake_minimum_required(VERSION 2.8) project( jpg ) # 明确指定C API依赖的OpenCV模块 find_package( OpenCV REQUIRED COMPONENTS core highgui imgproc ) add_executable( jpg jpg.c ) target_link_libraries( jpg ${OpenCV_LIBS} )
3. (可选)替换魔法数字为宏定义
代码中cvLoadImage的第二个参数用3不够直观,建议替换为OpenCV官方宏定义CV_LOAD_IMAGE_COLOR,增强代码可读性:
IplImage* inputImage = cvLoadImage(inputImagePath, CV_LOAD_IMAGE_COLOR);
完成以上修改后,重新执行cmake .和make即可正常编译运行。
内容的提问来源于stack exchange,提问作者Валентин Д.
相关产品推荐
相关产品推荐

