注意:缺少 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 通常意味着第一个非内联虚拟成员函数没有定义的主要内容,如果未能解决你的问题,请参考以下文章

注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义

iOS中的vtable错误

为啥即使不涉及虚函数,虚继承也需要vtable?

C++虚函数除了vtable怎么实现? [复制]

虚表(Vtables)

为啥纯虚函数初始化为0?