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

MinGW编译OpenCV C++代码遇函数未定义引用问题求助

问题:MinGW编译OpenCV代码出现未定义引用错误

代码内容

myscript.cpp的代码如下:

#include <iostream>
#include <opencv2\opencv.hpp>

using namespace std;

int main(){
    cout << "hello everyone" << endl;
    
    // Read an image
    cv::Mat img_test = cv::imread("test.jpg", 0);

    return 0;
}

编译命令

通过bat脚本执行的g++编译命令:

g++ -fdiagnostics-color=always -Wall -Wextra -o output.exe myscript.cpp -I C:\CPP\opencv\build\include -L C:\CPP\opencv\build\x64\vc16\lib -l opencv_world490

错误信息

编译时出现链接器错误:

C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\name\AppData\Local\Temp\cc1JAyEn.o:myscript.cpp:(.text+0x7a): undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\name\AppData\Local\Temp\cc1JAyEn.o:myscript.cpp:(.text+0xd2): undefined reference to `cv::Mat::~Mat()'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\name\AppData\Local\Temp\cc1JAyEn.o:myscript.cpp:(.text+0x114): undefined reference to `cv::Mat::~Mat()'
collect2.exe: error: ld returned 1 exit status

疑问

我习惯在Linux下进行编译操作,但Windows相关讨论多围绕Visual Studio,因许可证问题无法使用VS,仅能使用VSCode。请问:

  1. 如何解决上述编译错误?
  2. 错误信息中为何会出现那些奇怪的相对路径?

解决方案

1. 解决未定义引用错误

出现这类错误的核心原因是ABI不兼容:你从官网下载的OpenCV安装包是用Visual Studio(vc16对应VS2019)编译的,生成的库文件和MinGW(你用的是msys64下的ucrt64工具链)的C++ ABI不匹配,导致链接器无法找到函数定义。

解决方法有两种:

  • 方法一:自行用MinGW编译OpenCV源码

    1. 下载OpenCV源码包并解压,进入源码目录。
    2. 用CMake配置编译选项:指定编译器为MinGW的g++和gcc,设置安装路径,勾选BUILD_opencv_world(生成合并库),选择编译类型(Release/Debug)。
    3. 生成Makefile后,执行mingw32-make编译,完成后执行mingw32-make install安装到指定路径。
    4. 编译代码时,将-L参数指向MinGW编译生成的OpenCV库目录(比如C:\CPP\opencv-mingw\build\x64\lib),-l参数对应生成的库名(比如opencv_world490)。
  • 方法二:下载预编译的MinGW版本OpenCV
    找第三方提供的、匹配你所用MinGW工具链版本的OpenCV预编译包,解压后直接使用,编译命令的-I和-L参数指向该包的对应目录即可。

2. 解释奇怪的相对路径

错误信息中的相对路径是MinGW工具链内部的路径解析结果,属于正常现象:
这些路径是链接器ld.exe自身的安装路径,工具链通过相对路径定位自身组件,不影响编译过程,只是链接器输出错误时附带的自身路径信息,无需在意。


内容的提问来源于stack exchange,提问作者colaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:44:56