首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC:简单继承测试失败

GCC:简单继承测试失败
EN

Stack Overflow用户
提问于 2010-04-30 19:11:07
回答 3查看 11K关注 0票数 3

我正在构建一个名为YoghurtGum的开源2D游戏引擎。现在,我正在使用Google提供的NDK来开发Android端口。

我因为在我的应用程序中遇到的错误而发疯了,所以我做了一个简单的测试程序:

代码语言:javascript
复制
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;
}

看起来很容易,对吧?下面是我如何编译它的方法,这与编译其余代码的方式相同:

代码语言:javascript
复制
/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

(为了清晰起见,添加了行符)。这汇编得很好。但我们找到了链接器:

代码语言:javascript
复制
/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

就像你可能知道的,里面有很多不需要的拐弯抹角。那是因为它不管用。如果出现以下错误,它将失败:

代码语言:javascript
复制
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

这些都是我从实际应用程序中得到的相同错误。

如果有人能向我解释我的测试哪里出了问题,或者我有什么选择,或者我忘了我的链接器,我会非常非常感激的。

提前谢谢。

更新:

当我使析构函数没有内联时,我会得到新的、更令人兴奋的链接错误:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-30 19:18:00

使用g++驱动链接器,而不是gcc:

代码语言:javascript
复制
/home/oem/android-ndk-r3/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-g++
-Wl,
--entry=main,
...

更新:另一个问题似乎是使用-nostdlib。这将阻止编译器添加所有标准库(例如提供缺少外部元素的运行时库)。你需要这个有什么原因吗?

票数 9
EN

Stack Overflow用户

发布于 2011-11-23 15:52:59

尝试将-fno-rtti -fno-exceptions添加到g++命令行

票数 2
EN

Stack Overflow用户

发布于 2010-04-30 19:27:18

您试图在初始化列表中实例化一个没有继承的基。汽车只继承车辆,而不是基地。从您的代码来看,我想这就是您的意图。

我个人更喜欢使用组合,而不是多重继承-它更干净和更好的性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2747004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档