霭910 2025-04-04 02:57 采纳率: 0%
浏览 33

Ubuntu20.04下vscode编译opencv可执行文件时报错 undefined reference to `cv::Mat::Mat,如何解决?(相关搜索:人脸识别|c文件)

在学习人脸识别项目的过程中写好了一个程序,但是一直报 undefined reference to `cv::Mat::Mat()'的错误,请问应该如何解决
1.这是想要编译的可执行文件,face_recognition.cpp

include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/mat.hpp>
#include <vector>
#include <string>
using namespace std;
using namespace cv;

class HarrFaceRecognition
{
public:
    HarrFaceRecognition()
    {
        img=imread("test.jpg",IMREAD_GRAYSCALE);
        result = imread("test.jpg");
        harr_xml="haarcascade_frontalface_default.xml";
    }

void GetFace()
{
    //创建检测器
    CascadeClassifier object;
    //加载采样文件
    object.load(harr_xml);
    //检测人脸
    object.detectMultiScale(img,faces,1.1,3);
}

void Show()
{
    for(int i=0;i<faces.size();i++)
    {
        //人脸矩形框的左上角坐标
        int x=faces[i].tl().x;
        int y=faces[i].tl().y;
        //人脸矩形框的宽度和高度
        int width=faces[i].width;
        int height=faces[i].height;
        rectangle(result,Rect(x,y,width,height),Scalar(255,0,0));
    }
    imshow("result",result);
    waitKey(600);
}

protected:
    Mat img;//原图---->灰度加载
    Mat result;//显示
    string harr_xml;
    vector<Rect> faces;

};

int main()
{
    HarrFaceRecognition* p= new HarrFaceRecognition;
    p->GetFace();
    p->Show();
    return 0;
}

2.launch.json文件

{
    "configurations": [
        {
            "name": "C/C++: cpp 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.out",
            "args": [
                "`pkg-config","--libs","--cflags","opencv4`",
            ],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ build active file",        //要和 task.json的label字段一致
            "miDebuggerPath": "/usr/bin/gdb",
            //下面这行命令可以去除Vscode中编译后出现 [1]+   Done....  的提示
            "miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /usr/bin/gdb -q --interpreter=mi"
        }
    ],
    "version": "2.0.0"
}

3.task.json文件

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            //"command": "/usr/bin/cpp",                  //不能用这命名, 否则你可能会i报错 gdb failed with message 'file format not recognized'
            "command": "/usr/bin/g++", 
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.out",
                "`pkg-config","--libs","--cflags","opencv4`"    //这是添加第三方库代码,要添加什么库直接继续加就行,不要忘记了 ` 符号
                //如下面再加个 gazebo11 第三方库(你得保证你安装的第三方库中含有.pc文件)
              // "`pkg-config","--libs","--cflags","opencv4,gazebo11`"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}


4.c_cpp_properties.json文件

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include/x86_64-linux-gnu/sys",
                "/usr/local/include/opencv2",            //记得把opencv4的include路径包含,按我上述方法来安装opencv的话一般就是这个路径
                "/usr/include/x86_64-linux-gnu/sys"        //这是装了cuda的路径,如果无cuda请去除
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

然后这个文件夹里面是没有CMakeLists.txt文件的,不知道是不是没有这个文件的原因,还是说要找到mat库文件的路径(不知道具体怎么操作),希望有人能帮忙解答一下。

展开全部

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-04-04 02:57
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解决方案

    你遇到的问题是Vscode在编译OpenCV项目时报错undefined reference to cv::Mat::Mat()`,这可能是因为OpenCV库没有被正确链接。

    解决方法如下:

    1. 在Vscode中,添加OpenCV库的路径到includePathlibraryPath中。

    在Vscode的settings.json文件中添加以下代码:

    {
        "includePath": ["${workspaceFolder}/path/to/opencv/include"],
        "libraryPath": ["${workspaceFolder}/path/to/opencv/lib"]
    }
    

    其中,path/to/opencv/includepath/to/opencv/lib是OpenCV的include和lib文件夹的路径。

    1. 在Vscode的tasks.json文件中添加OpenCV库的链接。

    在Vscode的tasks.json文件中添加以下代码:

    {
        "version": "2.0.0",
        "tasks": [
            {
                "label": "build",
                "type": "shell",
                "command": "g++",
                "args": ["-o", "face_re", "face_re.cpp", "-lopencv_core", "-lopencv_imgproc", "-lopencv_highgui"],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            }
        ]
    }
    

    其中,face_re.cpp是你的源文件,-lopencv_core, -lopencv_imgproc, -lopencv_highgui是OpenCV库的链接选项。

    1. 重新编译项目。

    在Vscode中,点击"Terminal"->"Run Build Task",选择"build"任务,编译项目。

    如果你已经添加了OpenCV库的路径和链接,但仍然报错,可以尝试清除Vscode的缓存和重新编译项目。

    代码示例

    以下是一个简单的OpenCV项目,使用Vscode编译:

    #include <opencv2/opencv.hpp>
    
    int main() {
        cv::Mat img = cv::imread("image.jpg");
        cv::imshow("Image", img);
        cv::waitKey(0);
        return 0;
    }
    

    编译命令:

    g++ -o face_re face_re.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui
    

    结果

    编译成功后,你可以在Vscode的Terminal中看到可执行文件的输出结果。

    展开全部

    评论
  • 紫雾凌寒 人工智能领域新星创作者 2025-04-04 03:00
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析
      - 出现undefined reference tocv::Mat::Mat()’错误,表明链接阶段找不到cv::Mat`的默认构造函数的实现。这通常是因为在编译时没有正确链接OpenCV库。
    2. 解决方案
      - 确保你已经正确安装了OpenCV库并且在编译时指定了正确的库路径和库文件。
      - 以下是一个简单的示例,假设你的C++代码文件名为main.cpp,使用g++进行编译:
      bash g++ main.cpp `pkg-config --cflags --libs opencv4` -o face_re
      这里pkg-config --cflags --libs opencv4会自动获取OpenCV的编译选项(包括头文件路径等)和链接选项(库文件路径和库名)。
      - 如果是在VS Code中编译,你可以在.vscode文件夹下创建tasks.json文件,内容如下:
      json { "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "g++", "args": [ "${file}", "`pkg-config --cflags --libs opencv4`", "-o", "${fileDirname}/face_re" ], "group": { "kind": "build", "isDefault": true } } ] }
      然后在VS Code中通过Ctrl+Shift+B(或选择终端中的构建任务)来编译你的代码。
    3. 多种解决方案的优缺点
      - 直接指定编译选项
      • 优点:简单直接,能快速解决链接库的问题。
      • 缺点:不够灵活,如果项目需要切换OpenCV版本或者使用其他库,可能需要频繁修改编译选项。
      • 使用pkg-config
      • 优点:能自动获取库的编译和链接选项,方便快捷,而且当库的安装路径等发生变化时,它能自动适应。
      • 缺点:依赖系统中正确安装了pkg-config工具和相应的库配置文件。
    4. 总结
      - 这个错误主要是由于编译时缺少OpenCV库的链接导致的。通过正确指定编译选项或者使用pkg-config工具,可以解决链接问题,从而成功编译可执行文件。

    请检查你的OpenCV安装是否正确,以及编译命令是否符合你的项目配置。如果仍然有问题,请提供更多的编译信息和项目细节。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论
  • 宝码香车 JavaScript领域优质创作者 2025-04-04 09:04
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    根据你提供的错误信息和配置文件,这是一个典型的 OpenCV 链接问题。`undefined reference to cv::Mat::Mat()` 表明编译器找到了头文件但链接时找不到对应的库实现。

    解决方案

    1. 修正 task.json 的 pkg-config 参数

    当前你的 task.json 中 pkg-config 参数写法有问题,反引号 ` 在 JSON 中需要正确转义:

    "args": [
        "-fdiagnostics-color=always",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}.out",
        "$(pkg-config --libs --cflags opencv4)"
    ],
    

    2. 确保 OpenCV 已正确安装

    在终端执行以下命令验证:

    pkg-config --modversion opencv4
    pkg-config --libs opencv4
    pkg-config --cflags opencv4
    

    如果没有输出,需要安装 OpenCV 开发包:

    sudo apt-get install libopencv-dev
    

    3. 替代方案:手动指定链接参数

    如果 pkg-config 仍然有问题,可以手动指定路径(替换为你的实际路径):

    "args": [
        "-fdiagnostics-color=always",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}.out",
        "-I/usr/include/opencv4",
        "-lopencv_core",
        "-lopencv_imgproc",
        "-lopencv_highgui",
        "-lopencv_objdetect"
    ],
    

    4. 检查 CMake 替代方案(可选)

    虽然 VSCode 可以直接用 g++,但使用 CMake 会更规范:

    创建 CMakeLists.txt

    cmake_minimum_required(VERSION 3.10)
    project(FaceRecognition)
    
    find_package(OpenCV REQUIRED)
    
    add_executable(face_recognition face_recognition.cpp)
    target_link_libraries(face_recognition ${OpenCV_LIBS})
    

    然后编译:

    mkdir build && cd build
    cmake ..
    make
    

    5. 验证编译命令

    可以直接在终端测试编译命令是否有效:

    g++ -o face_recognition.out face_recognition.cpp $(pkg-config --libs --cflags opencv4)
    

    常见问题排查

    1. OpenCV 版本不匹配:确保安装的 OpenCV 版本与代码兼容
    2. 路径问题:检查 c_cpp_properties.json 中的 include 路径是否正确
    3. 库文件缺失:确认 /usr/lib/usr/local/lib 中有 libopencv_*.so 文件

    如果仍有问题,请提供完整的终端编译输出信息,可以帮助更精确地诊断问题。

    展开全部

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部