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. 解决未定义引用错误
出现这类错误的核心原因是ABI不兼容:你从官网下载的OpenCV安装包是用Visual Studio(vc16对应VS2019)编译的,生成的库文件和MinGW(你用的是msys64下的ucrt64工具链)的C++ ABI不匹配,导致链接器无法找到函数定义。
解决方法有两种:
方法一:自行用MinGW编译OpenCV源码
- 下载OpenCV源码包并解压,进入源码目录。
- 用CMake配置编译选项:指定编译器为MinGW的
g++和gcc,设置安装路径,勾选BUILD_opencv_world(生成合并库),选择编译类型(Release/Debug)。 - 生成Makefile后,执行
mingw32-make编译,完成后执行mingw32-make install安装到指定路径。 - 编译代码时,将
-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
相关产品推荐
相关产品推荐

