【问题标题】:Undefined reference to vtable when functions are defined in VS Code在 VS Code 中定义函数时对 vtable 的未定义引用
【发布时间】:2021-11-13 19:45:22
【问题描述】:

我已经看到了很多关于此的问题,但似乎看不出我缺少什么。我是 C++ 的新手。我正在使用带有 G++ 和 MINGW32 10.3.0 的 Visual Studio Code。当我尝试运行 test.cpp(如下)时,我收到两个错误:

...test.cpp:7: undefined reference to 'QData::getDataPacket(void*)

...undefined reference to 'vtable for QData'

// qdata.h
#ifndef QDATA_H_
#define QDATA_H_

//Define generic queue data
class QData {
    private:
        int data = 17;                                                               
    public:
        void virtual getDataPacket(void* dataptr);                                 
        void virtual setDataPacket(void* dataptr);                                 
};

#endif
// qdata.cpp
#include "qdata.h"

void QData::getDataPacket(void* dataptr) {                                 
    *(int*)dataptr = data;                                                  
}

void QData::setDataPacket(void* dataptr) {                                 
    data = *(int*)dataptr;                                                  
}
// test.cpp
#include <iostream>
#include "qdata.h"

int main() {
    QData qqq;
    int a;
    qqq.getDataPacket(&a);
    std::cout << a << std::endl;

    return 0;
}

我知道代码有效,因为它最初都在一个文件中并且编译良好。根据我的研究,这可能是一个链接问题?与此相关的大多数问题都涉及需要定义您的虚拟函数,但我已经这样做了。

如果我在终端中使用以下命令,binary.exe 运行正常(输出为 17): g++ -o binary test.cpp qdata.cpp

有没有办法在不手动输入 cpp 文件列表的情况下使其正确编译和运行?

编辑:由于似乎有些混乱,通常在 VSCode 中,您可以通过按 F5 一次性编译和调试。这是我得到上述错误的部分。我希望有人可以帮助我了解为什么会失败以及如何解决它,以便我可以继续在 VSCode 中进行测试/调试。

编辑:我仍然认为这个问题是独一无二的,因为我只是在跟踪 VS Code 中的编译错误。其实我之前找到过this的文章,并没有解决我的问题。它也非常密集,作为初学者很难理解它如何解释我的问题。我将添加一个 Visual Studio 代码标签来帮助人们找到这个问题。但我发现的所有其他对 vtable 错误的引用都与 vtable 本身有关,而不是遵循 VS Code 中的解决方案的故障排除路径。

【问题讨论】:

  • "有没有办法让它编译并正确运行,而无需手动输入 cpp 文件列表?" 听起来你在问是否可以编译一个 C++ 程序,而不编译 C++ 程序的全部。你不能。 “qdata.cpp”不是可选的。
  • 在 VSCode 中,您只需按 F5 即可编译并运行调试器。当我这样做时,我得到了我提到的错误。我在问如何让它用 F5 编译和调试。
  • @equiv " 我在问如何让它用 F5 编译和调试。" -- 对不起,不。您当前的问题 95% 集中在如何解决未定义的引用上。要询问如何在 VS Code 中做某事,您应该重写您的问题,以便重点关注如何在 VS Code 中 build c++ programs with multiple .ccp source files。您可以跳过有关未定义引用和 vtable 的错误消息,因为您显然已经知道解决方案。
  • 再说一次,这里是初学者。请耐心等待。也许我不知道我在问什么?我不认为我在问如何在 VSCode 中做某事,我是在解释当我按下 F5 并调用 g++ 编译(错误)时发生的事情与我明确告诉它使用时发生的事情之间存在差异两个cpp文件。我认为这些信息可能有助于有经验的人帮助我了解如何解决我的问题。让它与 F5 一起工作是我的最终目标。我认为这是一个阻止它链接的编码错误。不是吗?我会看看你的链接。

标签: c++ visual-studio-code g++ undefined-reference vtable


【解决方案1】:

@JaMiT 分享了一个link,帮助我找到了答案。事实证明,代码很好,但问题在于如何在 tasks.json 文件中配置 VisualStudio Code。如果您想使用 g++ 编译多个 cpp 文件(假设您使用了 Using GCC with MINGW 入门指南),您需要修改“args”。这是我的 tasks.json,它指定了要编译的 cpp 文件:

tasks.json

{
"tasks": [
    {
        "type": "cppbuild",
        "label": "C/C++: g++.exe build active file",
        "command": "C:\\msys64\\mingw64\\bin\\g++.exe",
        "args": [
            "-g",
            "test.cpp",
            "qdata.cpp",
            "-o",
            "${fileDirname}\\${fileBasenameNoExtension}.exe"
        ],
        "options": {
            "cwd": "${fileDirname}"
        },
        "problemMatcher": [
            "$gcc"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "detail": "Task generated by Debugger."
    }
],
"version": "2.0.0"

}

如果你只是想编译活动目录下的所有cpp文件,那么你可以修改如下:

{
"tasks": [
    {
        "type": "cppbuild",
        "label": "C/C++: g++.exe build active file",
        "command": "C:\\msys64\\mingw64\\bin\\g++.exe",
        "args": [
            "-g",
            "*.cpp",
            "-o",
            "${fileDirname}\\${fileBasenameNoExtension}.exe"
        ],
        "options": {
            "cwd": "${fileDirname}"
        },
        "problemMatcher": [
            "$gcc"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "detail": "Task generated by Debugger."
    }
],
"version": "2.0.0"

}

请注意,"${file}" 已从默认 tasks.json 文件的“args”中删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多