OpenCV头文件引入后无法链接函数:未定义引用问题求助
链接阶段错误:OpenCV cv::Mat 未定义引用
刚接触C++,尝试用OpenCV开发GUI程序,已在C盘安装CMake、Ninja和OpenCV。构建项目时,链接阶段出现错误,具体构建日志如下:
[main] Building folder: opencvtest [main] Configuring project: opencvtest [proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -SC:/opencvtest -Bc:/opencvtest/build -G Ninja [cmake] Not searching for unused variables given on the command line. [cmake] -- Configuring done (0.2s) [cmake] -- Generating done (0.1s) [cmake] -- Build files have been written to: C:/opencvtest/build [build] Starting build [proc] Executing command: chcp [proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --build c:/opencvtest/build --config Debug --target all -- [build] [1/1 100% :: 0.205] Linking CXX executable opencvtest.exe [build] FAILED: opencvtest.exe [build] C:\Windows\system32\cmd.exe /C "cd . && C:\msys64\ucrt64\bin\c++.exe -g CMakeFiles/opencvtest.dir/main.cpp.obj -o opencvtest.exe -Wl,--out-implib,libopencvtest.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -LC:/PROGRA~1/opencv/build/x64/vc16/lib -lopencv_world4100d -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ." [build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/opencvtest.dir/main.cpp.obj: in function `main': [build] C:/opencvtest/main.cpp:8: undefined reference to `cv::Mat::Mat()' [build] C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/opencvtest/main.cpp:19: undefined reference to `cv::Mat::~Mat()' [build] collect2.exe: error: ld returned 1 exit status [build] ninja: build stopped: subcommand failed. [proc] The command: "C:\Program Files\CMake\bin\cmake.EXE" --build c:/opencvtest/build --config Debug --target all -- exited with code: 1 [driver] Build completed: 00:00:00.360 [build] Build finished with exit code 1
我的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.10) project(opencvtest) set(CMAKE_CXX_STANDARD 11) # Specify the path to OpenCV headers include_directories("C:/Program Files/opencv/build/include") # Specify the path to OpenCV library directories link_directories("C:/Program Files/opencv/build/x64/vc16/lib") # Add the executable add_executable(opencvtest main.cpp) # Link against the OpenCV libraries target_link_libraries(opencvtest opencv_world4100d)
main.cpp文件内容:
#include <stdio.h> #include <opencv2/opencv.hpp> int main(int argc, char** argv ) { cv::Mat image; /**image = imread("C:\\opencvtest\\1.jpg"); if ( !image.data ) { printf("No image data \n"); return -1; }**/ //namedWindow("Display Image", WINDOW_AUTOSIZE ); //imshow("Display Image", image); //waitKey(0); return 0; }
已检查系统变量(opencv_version可输出版本号),IntelliSense能识别头文件(删除lib文件夹会出现波浪线)。
问题原因
当前使用的是MinGW编译器(日志中C:\msys64\ucrt64\bin\c++.exe),但安装的OpenCV是VC16(Visual Studio 2019)编译版本(路径C:/Program Files/opencv/build/x64/vc16/lib)。MinGW和MSVC的ABI(应用二进制接口)不兼容,导致链接时无法找到cv::Mat相关符号。
解决方案
方案1:更换为MSVC编译器
打开Visual Studio的开发者命令提示符,执行以下命令,使用MSVC编译器构建项目(与已安装的OpenCV版本兼容):
cmake -S C:/opencvtest -B C:/opencvtest/build -G "Visual Studio 16 2019" -A x64 cmake --build C:/opencvtest/build --config Debug
方案2:重新编译OpenCV(MinGW版本)
从OpenCV官方源码编译适配MinGW的版本:
- 下载OpenCV源码及可选的contrib扩展包。
- 用CMake配置生成MinGW项目,指定编译器为msys64的gcc/g++。
- 编译并安装后,在项目中链接该版本的OpenCV库。
方案3:优化CMakeLists.txt写法(配合方案1/2)
推荐使用find_package自动引入OpenCV,避免手动指定路径的错误:
cmake_minimum_required(VERSION 3.10) project(opencvtest) set(CMAKE_CXX_STANDARD 11) # 自动查找OpenCV,需确保OpenCV_DIR环境变量指向安装目录的build文件夹 find_package(OpenCV REQUIRED) add_executable(opencvtest main.cpp) # 链接OpenCV库,自动包含所有必要的依赖 target_link_libraries(opencvtest ${OpenCV_LIBS})
内容的提问来源于stack exchange,提问作者user25670157
相关产品推荐
相关产品推荐

