Je construis un moteur de jeu 2D open source appelé YoghurtGum. En ce moment je travaille sur le port d'Android, en utilisant le NDK fourni par Google.GCC: échec du test d'héritage simple
Je devenais fou à cause des erreurs que je recevais dans ma demande, donc je fait un programme de test simple:
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;
}
semble assez facile, non? Voici comment je compile, ce qui est de la même façon que je compilez le reste de mon code:
/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
(sauts de ligne sont ajoutés pour plus de clarté). Cela compile bien. Mais nous arrivons à l'éditeur de liens:
/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
Comme vous pouvez le constater, il y a beaucoup de cochonneries là-dedans qui est pas vraiment nécessaire. C'est parce que ça ne marche pas. Il échoue avec les erreurs suivantes:
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
Ce sont les mêmes erreurs que je reçois de mon application actuelle.
Si quelqu'un pouvait m'expliquer où je me suis trompé dans mon test ou quelle option ou j'ai oublié dans mon éditeur de liens, je serais très, extrêmement reconnaissant.
Merci d'avance.
MISE À JOUR:
Quand je fais mes Destructeurs non inline, je reçois de nouvelles erreurs de lien plus excitant:
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
Est-ce que ça marche si vous ajoutez -fPIC? – ognian
Je crains que cela soit lié au C++, ce qui signifie que vous allez beaucoup souffrir. Pour commencer, utilisez 'C++ filt' pour savoir quel est son nom lisible par un humain. Aussi je ne pense pas que libgcc_s.so a quelque chose à voir avec C++ –