GCC: Test Simple dědičnost selže

hlasů
3

Stavím open source 2D herní engine nazvaný YoghurtGum. Právě teď pracuji na Android portu pomocí NDK poskytované společností Google.

Chystal jsem se zbláznil kvůli chybám Byla jsem v mé žádosti, a tak jsem udělal jednoduchý testovací program:

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;
}

Zdá se to snadné, že? Zde je návod, jak jsem ho sestavit, což je stejný způsob, jak sestavit zbytek mého kódu:

/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

(Konce řádků jsou přidány pro přehlednost). To kompiluje v pořádku. Ale pak se dostaneme k spojce:

/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

Jak jste si asi říct, že je tu spousta cruft tam, že není opravdu potřeba. To proto, že to nefunguje. To se nezdaří s následující chyby:

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

Jedná se o stejné chyby jsem se dostat z mého skutečného použití.

Kdyby někdo mohl vysvětlit mi, kde jsem šel v mém testu nebo jaká volba nebo zapomněl jsem ve svém spojkou špatně, byl bych velmi, velmi vděčný.

Díky předem.

AKTUALIZACE:

Když jsem se, aby se mé Destruktory non-inline, získám nové a vzrušující chyby propojení:

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
Položena 30/04/2010 v 20:11
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
9

Pomocí g ++ řídit linkeru, ne gcc:

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

Aktualizace : dalším problémem se zdá být vaše používání využití -nostdlib. To je zastavení překladač ze sčítání všechny standardní knihovny (například runtime knihovně, která poskytuje své chybějící externích). Existuje důvod, proč je třeba to?

Odpovězeno 30/04/2010 v 20:18
zdroj uživatelem

hlasů
1

Zkuste přidat -fno-rtti -fno-exceptionsdo g příkazového řádku ++

Odpovězeno 23/11/2011 v 16:52
zdroj uživatelem

hlasů
1

Pokusili jste se vytvořit instanci v seznamu inicializace základnu jste nezdědil od. Car dědí pouze z vozidla a ne i základna. Z kódu Domnívám se, že byl váš záměr.

Já osobně raději používat složení spíše než vícenásobnou dědičnost - je to čistší a lepší výkon.

Odpovězeno 30/04/2010 v 20:27
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more