注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义
Posted
技术标签:
【中文标题】注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义【英文标题】:NOTE: a missing vtable usually means the first non-inline virtual member function has no definition 【发布时间】:2021-02-24 20:51:27 【问题描述】:我的系统是 macOS Big Sur,但我遇到了编译问题。这是我的程序:
#include <iostream>
#include <sys/ioctl.h>
#include <unistd.h>
class view
virtual void draw() = 0;
;
class tui : view
public:
void draw();
;
void tui::draw()
struct winsize size;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &size);
printf("x = %hu, y = %hu\n", size.ws_row, size.ws_col);
int main()
tui a;
a.draw();
这是我尝试gcc -Wall main.cpp -o my_program
时的错误:
Undefined symbols for architecture x86_64:
"vtable for __cxxabiv1::__class_type_info", referenced from:
typeinfo for view in main-c2a1d3.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for __cxxabiv1::__si_class_type_info", referenced from:
typeinfo for tui in main-c2a1d3.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"___cxa_pure_virtual", referenced from:
vtable for view in main-c2a1d3.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
你知道这个问题吗?
【问题讨论】:
【参考方案1】:您正在尝试使用 C 编译器编译 C++ 代码。只需使用:
g++ -Wall main.cpp -o my_program
【讨论】:
向前迈出一步:为什么用 C 编译器编译 C++ 代码会导致此链接器错误,但会导致其他错误?甚至,为什么链接器错误?为什么不编译错误?【参考方案2】:__cxa_pure_virtual
由libc++定义,使用clang
(/gcc
)时默认不链接。这个函数被virtual void draw() = 0;
隐式使用,所以会链接失败。
改用clang++
(clang++ -Wall main.cpp -o my_program
),这将链接正确的运行时。
【讨论】:
以上是关于注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义的主要内容,如果未能解决你的问题,请参考以下文章