gpt4 book ai didi

c++ - GCC:简单继承测试失败

转载 作者:太空宇宙 更新时间:2023-11-03 11:41:31 25 4
gpt4 key购买 nike

我正在构建一个名为 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

最佳答案

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

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

更新:另一个问题似乎是您对 -nostdlib 的使用。这会阻止编译器添加所有标准库(例如提供您缺少的外部组件的运行时库)。您需要这个吗?

关于c++ - GCC:简单继承测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2747004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com