我正在构建一个名为YoghurtGum的开源2D游戏引擎。现在,我正在使用Google提供的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发布于 2010-04-30 19:18:00
使用g++驱动链接器,而不是gcc:
/home/oem/android-ndk-r3/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-g++
-Wl,
--entry=main,
...更新:另一个问题似乎是使用-nostdlib。这将阻止编译器添加所有标准库(例如提供缺少外部元素的运行时库)。你需要这个有什么原因吗?
发布于 2011-11-23 15:52:59
尝试将-fno-rtti -fno-exceptions添加到g++命令行
发布于 2010-04-30 19:27:18
您试图在初始化列表中实例化一个没有继承的基。汽车只继承车辆,而不是基地。从您的代码来看,我想这就是您的意图。
我个人更喜欢使用组合,而不是多重继承-它更干净和更好的性能。
https://stackoverflow.com/questions/2747004
复制相似问题