You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Валентин Д.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:14:52