我正在构建一个名为YoghurtGum的开源2D游戏引擎。现在我正在使用谷歌提供的NDK在Android端口上工作。
由于我在应用程序中遇到的错误,我很生气,所以我做了一个简单的测试程序:
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
答案 0 :(得分:9)
使用g ++驱动链接器,而不是gcc:
/home/oem/android-ndk-r3/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-g++
-Wl,
--entry=main,
...
更新:另一个问题似乎是您对-nostdlib
的使用。这会阻止编译器添加所有标准库(例如提供缺少的外部的运行时库)。你需要这个吗?
答案 1 :(得分:2)
尝试将-fno-rtti -fno-exceptions
添加到g ++命令行
答案 2 :(得分:1)
您尝试在初始化列表中实例化一个您未从中继承的基础。汽车只从车辆继承,而不是基地。从你的代码我认为这是你的意图。
我个人更喜欢使用合成而不是多重继承 - 它更清晰,性能更好。