3

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
4

3 に答える 3

9

gcc ではなく、g++ を使用してリンカを駆動します。

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

更新: 別の問題は、 の使用にあるようです-nostdlib。これにより、コンパイラがすべての標準ライブラリ (不足している外部を提供するランタイム ライブラリなど) を追加できなくなります。これが必要な理由はありますか?

于 2010-04-30T19:18:00.777 に答える
2

-fno-rtti -fno-exceptionsg++ コマンドラインに追加してみてください

于 2011-11-23T15:52:59.017 に答える
1

継承元ではないベースを初期化リストでインスタンス化しようとしました。Car は Vehicle からのみ継承し、Base からも継承しません。あなたのコードから、それがあなたの意図であると思います。

個人的には、多重継承よりも構成を使用することを好みます。これは、クリーンでパフォーマンスが優れているためです。

于 2010-04-30T19:27:18.590 に答える