C++通过cmake调用opencv出现undefined reference to xxx错误(win11)?

代码非常简单,就一个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)

完全没有头绪...望大佬解答!

阅读 8.1k
4 个回答
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})
新手上路,请多包涵

问题1:OpenCV_DIR设置错误
如果你用自己编译的,应该这样写:

set(OpenCV_DIR E:/work/opencv-4.6.0/build/install)

opencv编译以后,不执行make install,它是不会把所有include 和lib拷贝到一起的
你上面用set(OpenCV_DIR)
但是后面target_link_libraries 应该写成:

target_link_libraries(${PROJECT_NAME} opencv_world470)

即可
问题2: 看你输出Link正确出了hello.exe link_load libraries错误
最大可能性就是没把opencv_world470.dll 设置到环境目录
你可以拷贝opencv_world470.dll 到hello.exe同一目录下
或者 设置opencv_world470.dll到环境变量

# opencv库里所有lib dll文件都链接了
target_link_libraries(${PROJECT_NAME} opencv_world470 opencv_world470d opencv_world470.dll opencv_world470d.dll)

链接不需要 dll,dll 是你在运行的时候才需要的,你的后缀呢?opencv_world470 应该是 opencv_world470.lib 吧?把文件名写全了试试:

# opencv库里所有lib dll文件都链接了
target_link_libraries(${PROJECT_NAME} opencv_world470.lib opencv_world470d.lib)

第一步:OpenCV没有编译和安装,可参考:https://blog.csdn.net/2301_76911910/article/details/139509421
第二步:编译安装后,OpenCV相关链接库路径:构建的MinGW\install\x64\mingw\lib,Cmake文件中添加库路径和相关库名称

link_directories(构建的MinGW\\install\\x64\\mingw\\bin)
target_link_libraries(MyProject
    opencv_calib3d4100
    opencv_core4100
    opencv_dnn4100
    opencv_features2d4100
    opencv_gapi4100
    opencv_highgui4100
    opencv_flann4100
    opencv_imgcodecs4100
    opencv_imgproc4100
    opencv_imgcodecs4100
    opencv_videoio4100
)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题