在VSCode中用MinGW编译OpenCV C++程序时出现undefined reference错误
我希望在Visual Studio Code中编写OpenCV C++程序,已编写测试代码如下:
#include <iostream> #include <cstdlib> #include <opencv2\opencv.hpp> using namespace std; using namespace cv; int main(){ Mat image = imread("image.png"); while(true){ imshow("live" , image); if(waitKey(0) == 'N') break; } return 0; }
已配置环境变量PATH,头文件路径为C:\msys64\mingw64\include\c++\13.2.0,tasks.json配置如下:
{"version": "2.0.0","tasks": [{"label": "OpenCV","type": "shell","command": "g++","args": ["-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe","-I","C:\\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\\include","-L","C:\\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\\x64\\mingw\\bin","-llibopencv_calib3d348","-llibopencv_core348","-llibopencv_dnn348","-llibopencv_features2d348","-llibopencv_flann348","-llibopencv_highgui348","-llibopencv_imgcodecs348","-llibopencv_imgproc348","-llibopencv_ml348","-llibopencv_objdetect348","-llibopencv_photo348","-llibopencv_stitching348","-llibopencv_video348","-llibopencv_videoio348"],"group": "build"},{"type": "cppbuild","label": "C/C++: g++.exe build active file","command": "C:\\msys64\\mingw64\\bin\\g++.exe","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"],"options": {"cwd": "${fileDirname}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "Task generated by Debugger."}]}
在终端执行命令g++ .\test.cpp -o .\test.exe时,出现undefined reference类链接错误。请问该如何解决?是否需要编写Makefile或使用CMake?
1. 直接使用VS Code中配置好的OpenCV任务编译
你已经在tasks.json中配置了名为OpenCV的编译任务,该任务包含了编译OpenCV程序所需的所有头文件路径、库路径和链接参数。操作步骤:
- 打开VS Code,按下
Ctrl+Shift+B - 在弹出的任务列表中选择
OpenCV任务,等待编译完成即可。
2. 终端手动编译时补充完整参数
你直接执行的g++ .\test.cpp -o .\test.exe命令只完成了编译步骤,没有指定OpenCV的头文件目录、库目录以及需要链接的库,所以链接阶段找不到OpenCV函数的实现。需要执行完整的编译命令:
g++ -g .\test.cpp -o .\test.exe -I "C:\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\include" -L "C:\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\x64\mingw\bin" -llibopencv_core348 -llibopencv_highgui348 -llibopencv_imgcodecs348
提示:不需要链接所有OpenCV库,只需要链接代码中用到的库即可。你的测试代码用到了
core(核心功能)、highgui(窗口显示)、imgcodecs(图片读取),这三个库足够。
3. 关于Makefile或CMake的选择
小项目/快速验证:可以写简单的Makefile简化编译操作,避免每次输入冗长命令。示例Makefile:
CC = g++ CFLAGS = -g -I"C:\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\include" LDFLAGS = -L"C:\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\x64\mingw\bin" -llibopencv_core348 -llibopencv_highgui348 -llibopencv_imgcodecs348 TARGET = test.exe SOURCES = test.cpp all: $(TARGET) $(TARGET): $(SOURCES) $(CC) $(CFLAGS) $(SOURCES) -o $(TARGET) $(LDFLAGS) clean: del $(TARGET)保存为
Makefile后,在终端执行make即可完成编译,执行make clean可删除生成的exe文件。中大型项目:推荐使用CMake,它能更好地管理依赖和编译流程,跨平台兼容性更强。示例CMakeLists.txt:
cmake_minimum_required(VERSION 3.10) project(OpenCVTest) set(CMAKE_CXX_STANDARD 11) # 指定OpenCV安装路径 find_package(OpenCV REQUIRED PATHS "C:/OpenCV-MinGW-Build-OpenCV-3.4.8-x64/x64/mingw") add_executable(test test.cpp) target_link_libraries(test ${OpenCV_LIBS})操作步骤:
- 在项目目录下创建
build文件夹 - 进入build文件夹,执行
cmake .. -G "MinGW Makefiles" - 执行
make完成编译
- 在项目目录下创建
内容的提问来源于stack exchange,提问作者ninjabattery

