GCC: простой тест наследования не проходит - PullRequest
3 голосов
/ 30 апреля 2010

Я создаю движок 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

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

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

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

UPDATE:

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

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

Ответы [ 3 ]

9 голосов
/ 30 апреля 2010

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

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

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

2 голосов
/ 23 ноября 2011

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

1 голос
/ 30 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...