【问题标题】:Undefined symbols for architecture x86_64 vtable架构 x86_64 vtable 的未定义符号
【发布时间】:2014-05-27 17:49:21
【问题描述】:

我试图在 Netbeans C++ for mac 中做一个项目,当我为一个名为 servicio 的类做一个简单的构造函数时,编译器向我显示以下错误:

"/Applications/Xcode.app/Contents/Developer/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
"/Applications/Xcode.app/Contents/Developer/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/medicos
mkdir -p dist/Debug/GNU-MacOSX
g++     -o dist/Debug/GNU-MacOSX/medicos build/Debug/GNU-MacOSX/agenda.o build/Debug/GNU-MacOSX/cita.o build/Debug/GNU-MacOSX/contenedor.o build/Debug/GNU-MacOSX/doctor.o build/Debug/GNU-MacOSX/fecha.o build/Debug/GNU-MacOSX/main.o build/Debug/GNU-MacOSX/objetoBase.o build/Debug/GNU-MacOSX/paciente.o build/Debug/GNU-MacOSX/padecimiento.o build/Debug/GNU-MacOSX/servicio.o 
Undefined symbols for architecture x86_64:
  "vtable for servicio", referenced from:
      servicio::servicio(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in servicio.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [dist/Debug/GNU-MacOSX/medicos] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

我不太确定可能是什么问题,我是编程初学者,所以我对此了解不多,谢谢您的帮助。

【问题讨论】:

  • 请同时出示相关代码。
  • 在 QT 的情况下,这通常意味着你还没有重建你需要重建的所有东西。
  • 这是 .h 文件:#ifndef SERVICIO_H #define SERVICIO_H #include using namespace std;类服务{公共:服务(字符串);虚拟字符串 toString() const;虚拟〜服务();私人:字符串名词; }; #endif /* SERVICIO_H */ 这是.cpp:#include "servicio.h" servicio::servicio(string nombre):nombre(nombre){ } 只是尝试做那个简单的构造函数
  • 我擦除了 virtuals 和 const,现在它正在运行,我不知道为什么但它可以工作,如果有人知道为什么请告诉我,谢谢

标签: c++ x86-64 vtable


【解决方案1】:

PSA,因为这是 Google 搜索的热门结果:如果您使用的是 Qt,此错误也可能意味着您没有为该类构建 MOC 目标文件。

【讨论】:

    【解决方案2】:

    链接器会打印这些错误,因为您的函数定义不存在。 您声明了 3 个函数,但您只定义了构造函数。

    删除virtuals 会有所帮助,因为链接器不需要这些功能。 对于virtual,链接器使用它们来创建vtable

    如果你在程序的任何其他地方使用这些函数而没有定义它们,错误将会再次出现。

    【讨论】:

    • 非常感谢!我也是 C++ 新手,这对我有帮助!
    【解决方案3】:

    如果您使用 QT,在绝大多数情况下,您会收到 vtable 错误,因为您在将 Q_OBJECT 宏添加到文件后没有重新运行 qmake

    致谢:https://forum.qt.io/post/178663

    【讨论】:

    • 我只想说谢谢!!!!!!我整个下午都在努力解决这个问题,你节省了我的时间!
    【解决方案4】:

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

    那么你声明的两个函数的定义在哪里?

    virtual string toString() const;
    virtual ~servicio();
    

    它们不存在。编译器告诉你它们不存在。不,我花时间告诉你编译器告诉你它们不存在,而且它们不存在。

    这就是编译器告诉你它们不存在的原因。因为它们不存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 2012-07-20
      • 1970-01-01
      • 2015-08-23
      • 2017-07-06
      • 2016-06-20
      • 2016-06-14
      相关资源
      最近更新 更多