代码非常简单,就一个cpp文件,但是里面涉及opencv的cv::Mat/cv::imread/cv::imshow/cv::waitKey在用cmake构建时全部报错。
将涉及cv的部分注释掉,只保留一个std::cout<<“hello world!”<<std::endl;的话是可以正常构建,运行的,也就是说,cmake和c++本身没问题。
#include <iostream> #include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> int main(void) { std::cout<<"hello world!"<<std::endl; cv::Mat img1 = cv::imread("wallhaven-105871.jpg",cv::IMREAD_COLOR); cv::imshow("img1", img1); cv::waitKey(0); return 0; }
build时具体的报错信息为:
[build] [ 50%] Linking CXX executable hello.exe [build] D:/keypro/mingw64posix/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\hello.dir/objects.a(helloworld.cpp.obj): in function `main': [build] D:/WORK/opencvproj/helloworld.cpp:9: undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)' [build] D:/keypro/mingw64posix/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/WORK/opencvproj/helloworld.cpp:10: undefined reference to `cv::imshow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)' [build] D:/keypro/mingw64posix/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/WORK/opencvproj/helloworld.cpp:11: undefined reference to `cv::waitKey(int)' [build] D:/keypro/mingw64posix/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/WORK/opencvproj/helloworld.cpp:13: undefined reference to `cv::Mat::~Mat()' [build] D:/keypro/mingw64posix/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/WORK/opencvproj/helloworld.cpp:13: undefined reference to `cv::Mat::~Mat()'
以下为CMakeLists.txt:
cmake_minimum_required(VERSION 3.19) project(hello) set(OpenCV_DIR "D:/WORK/opencv/build/x64/vc16/lib") find_package(OpenCV REQUIRED CONFIG) # 此处的find_package是可以正常找到opencv的 include_directories(${OpenCV_INCLUDE_DIRS}) # dll lib文件所在目录均被加入链接路径 link_directories( D:/WORK/opencv/build/x64/vc16/lib) link_directories( D:/WORK/opencv/build/x64/vc16/bin) add_executable(hello helloworld.cpp) # opencv库里所有lib dll文件都链接了 target_link_libraries(${PROJECT_NAME} opencv_world470 opencv_world470d opencv_world470.dll opencv_world470d.dll)
完全没有头绪…望大佬解答!
cmake_minimum_required(VERSION 3.19) project(hello) set(OpenCV_DIR "D:/WORK/opencv/build") find_package(OpenCV REQUIRED) # 此处的find_package是可以正常找到opencv的 add_executable(hello helloworld.cpp) # opencv库里所有lib dll文件都链接了 target_link_libraries(hello ${OpenCV_LIBS})