Неопределенные символы для архитектуры x86_64 vtable

Я пытаюсь сделать проект в Netbeans C++ для 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

Я не совсем уверен, в чем может быть проблема, я новичок в программировании, поэтому я мало что знаю об этом, спасибо за помощь.


person ChrisU    schedule 13.04.2014    source источник
comment
Пожалуйста, покажите нам соответствующий код.   -  person stefan    schedule 14.04.2014
comment
В случае с QT это часто означает, что вы не пересобрали все, что нужно для перестроения.   -  person Mats Petersson    schedule 14.04.2014
comment
Это файл .h: #ifndef SERVICIO_H #define SERVICIO_H #include ‹string› с использованием пространства имен std; сервисный класс { общественный: сервисный (строка); виртуальная строка toString() const; виртуальный ~service(); частный: номер строки; }; #endif /* SERVICIO_H */ и это .cpp: #include servicio.h servicio::servicio(string nombre):nombre(nombre){ } просто пытаюсь сделать этот простой конструктор   -  person ChrisU    schedule 14.04.2014
comment
Я стираю виртуалки и константу и теперь она работает, я не знаю почему, но она работает, если кто-то знает, почему, пожалуйста, скажите мне, спасибо   -  person ChrisU    schedule 14.04.2014


Ответы (4)


Компоновщик выводит ошибку, потому что определений ваших функций не существует. Вы объявили 3 функции, но определили только конструктор. Стирание виртуальных машин помогает, потому что компоновщик не использует эти функции. Когда они виртуальные, компоновщик использует их для создания vtable. Если вы используете эти функции в программе без их определения, ошибка вернется.

person NO_NAME    schedule 13.04.2014
comment
Большое спасибо! Я тоже новичок в C++, и это помогло мне! - person Evan Murray; 29.04.2020

PSA, так как это лучший результат поиска Google: если вы используете Qt, эта ошибка также может означать, что вы не создали объектный файл MOC для этого класса.

person Artfunkel    schedule 18.04.2016

Если вы используете QT, в подавляющем большинстве случаев вы получаете ошибку vtable, потому что вы не перезапустили qmake после добавления макроса Q_OBJECT в файл.

Авторы: https://forum.qt.io/post/178663

person Adriel Jr    schedule 12.03.2019
comment
Просто хочу сказать спасибо!!!!! Я боролся с этой проблемой весь день, и вы экономите мое время! - person Zachary HUANG; 22.09.2020

ПРИМЕЧАНИЕ. Отсутствующая виртуальная таблица обычно означает, что первая не встроенная виртуальная функция-член не имеет определения.

Так где же определение двух объявленных вами функций?

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

Они не существуют. Компилятор сказал вам, что они не существуют. И нет, я не тороплюсь, чтобы сказать вам, что компилятор сказал вам, что их не существует, и что они не существуют.

Вот почему компилятор говорит вам, что их не существует. Потому что их нет.

person Dan    schedule 13.04.2014