提问人:equiv 提问时间:9/20/2021 最后编辑:equiv 更新时间:9/25/2021 访问量:402
在 VS Code 中定义函数时对 vtable 的未定义引用 [duplicate]
Undefined reference to vtable when functions are defined in VS Code [duplicate]
问:
我看到了很多关于这个问题的问题,但似乎看不到我错过了什么。我对 C++ 相当陌生。我正在将 Visual Studio Code 与 G++ 和 MINGW32 10.3.0 一起使用。当我尝试运行 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 中编译错误的跟踪。我之前实际上已经找到了这篇文章,但它并没有解决我的问题。它也非常密集,作为初学者很难理解它如何解释我的问题。我将添加一个 Visual Studio Code 标记来帮助人们找到这个问题。但是我发现的对 vtable 错误的所有其他引用都与 vtable 本身有关,而不是遵循 VS Code 中解决方案的故障排除路径。
答:
@JaMiT分享了一个链接,帮助我找到了答案。事实证明,代码很好,但问题在于如何在tasks.json文件中配置VisualStudio Code。如果你想用 g++ 编译多个 cpp 文件(假设你使用了 将 GCC 与 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"
}
如果您只想编译 Active Directory 中的所有 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"
}
请注意,它已从默认 tasks.json 文件的“args”中删除。"${file}"
评论