GCC: Простой тест наследования не работает

Я создаю 2D-движок с открытым исходным кодом под названием YoghurtGum. Сейчас я работаю над портом Android, используя NDK от Google.

Я сошел с ума из-за ошибок, которые я получал в своем приложении, поэтому я сделал простую тестовую программу:

class Base { public: Base() { } virtual ~Base() { } }; // class Base class Vehicle : virtual public Base { public: Vehicle() : Base() { } ~Vehicle() { } }; // class Vehicle class Car : public Vehicle { public: Car() : Base(), Vehicle() { } ~Car() { } }; // class Car int main(int a_Data, char** argv) { Car* stupid = new Car(); return 0; } 

Кажется, достаточно легко, не так ли? Вот как я его компилирую, так же, как я компилирую остальную часть моего кода:

 /home/oem/android-ndk-r3/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-g++ -g -std=c99 -Wall -Werror -O2 -w -shared -fshort-enums -I ../../YoghurtGum/src/GLES -I ../../YoghurtGum/src -I /home/oem/android-ndk-r3/build/platforms/android-5/arch-arm/usr/include -c src/Inheritance.cpp -o intermediate/Inheritance.o 

(Для ясности добавляются разрывы строк). Это прекрасно компилируется. Но потом мы добираемся до компоновщика:

 /home/oem/android-ndk-r3/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc -lstdc++ -Wl, --entry=main, -rpath-link=/system/lib, -rpath-link=/home/oem/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib, -dynamic-linker=/system/bin/linker, -L/home/oem/android-ndk-r3/build/prebuilt/linux-x86/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0, -L/home/oem/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib, -rpath=../../YoghurtGum/lib/GLES -nostdlib -lm -lc -lGLESv1_CM -z /home/oem/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o /home/oem/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib/crtend_android.o intermediate/Inheritance.o ../../YoghurtGum/bin/YoghurtGum.a -o bin/Galaxians.android 

Как вы, наверное, можете сказать, там много крути, что действительно не нужно. Это потому, что это не работает. Он не работает со следующими ошибками:

 intermediate/Inheritance.o:(.rodata._ZTI3Car[typeinfo for Car]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' intermediate/Inheritance.o:(.rodata._ZTI7Vehicle[typeinfo for Vehicle]+0x0): undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info' intermediate/Inheritance.o:(.rodata._ZTI4Base[typeinfo for Base]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info' collect2: ld returned 1 exit status make: *** [bin/Galaxians.android] Fout 1 

Это те же ошибки, которые я получаю от своего фактического приложения.

Если бы кто-нибудь мог объяснить мне, где я ошибся в своем тесте или какой вариант, или я забыл в своем линкере, я был бы очень, очень благодарен.

Заранее спасибо.

ОБНОВИТЬ:

Когда я делаю свои деструкторы не включенными, я получаю новые и более захватывающие ошибки ссылок:

 intermediate/Inheritance.o:(.rodata+0x78): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' intermediate/Inheritance.o:(.rodata+0x90): undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info' intermediate/Inheritance.o:(.rodata+0xb0): undefined reference to `vtable for __cxxabiv1::__class_type_info' collect2: ld returned 1 exit status make: *** [bin/Galaxians.android] Fout 1 

Используйте g ++ для управления компоновщиком, а не gcc:

 /home/oem/android-ndk-r3/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-g++ -Wl, --entry=main, ... 

Обновление . Еще одна проблема заключается в использовании -nostdlib . Это останавливает компилятор от добавления всех стандартных библиотек (таких как библиотека времени выполнения, которая предоставляет ваши недостающие внешние ресурсы). Есть ли причина, в которой вы нуждаетесь?

Вы пытались создать в своем списке инициализации базу, на которой вы не наследовали. Автомобиль наследует только Автомобиль, а не Базу. Из вашего кода я предполагаю, что это было вашим намерением.

Я лично предпочитаю использовать композицию, а не множественное наследование – это более чистая и лучшая производительность.

Попробуйте добавить -fno-rtti -fno-exceptions в командную строку g ++