2010-04-19 101 views
2

好吧,這裏是輸出我得到:Linux下C++:鏈接器輸出奇怪的錯誤

arm-none-linux-gnueabi-ld --entry=main -dynamic-linker=/system/bin/linker -rpath-link=/home/oem/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib -L/home/oem/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib -nostdlib -lstdc++ -lm -lGLESv1_CM -rpath=/home/oem/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib -rpath=../../YoghurtGum/lib/Android -L./lib/Android intermediate/Alien.o intermediate/Bullet.o intermediate/Game.o intermediate/Player.o ../../YoghurtGum/bin/YoghurtGum.a -o bin/Galaxians.android 
intermediate/Game.o: In function `Galaxians::Init()': 
/media/YoghurtGum/Tests/Galaxians/src/Game.cpp:45: undefined reference to `__cxa_end_cleanup' 
/media/YoghurtGum/Tests/Galaxians/src/Game.cpp:44: undefined reference to `__cxa_end_cleanup' 
intermediate/Game.o:(.ARM.extab+0x18): undefined reference to `__gxx_personality_v0' 
intermediate/Game.o: In function `Player::Update()': 
/media/YoghurtGum/Tests/Galaxians/src/Player.h:41: undefined reference to `__cxa_end_cleanup' 
intermediate/Game.o:(.ARM.extab.text._ZN6Player6UpdateEv[_ZN6Player6UpdateEv]+0x0): undefined reference to `__gxx_personality_v0' 
intermediate/Game.o:(.rodata._ZTIN10YoghurtGum4GameE[_ZTIN10YoghurtGum4GameE]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info' 
intermediate/Game.o:(.rodata._ZTI6Player[_ZTI6Player]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' 
intermediate/Game.o:(.rodata._ZTIN10YoghurtGum6EntityE[_ZTIN10YoghurtGum6EntityE]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' 
intermediate/Game.o:(.rodata._ZTIN10YoghurtGum6ObjectE[_ZTIN10YoghurtGum6ObjectE]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info' 
intermediate/Game.o:(.rodata._ZTI6Bullet[_ZTI6Bullet]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' 
intermediate/Game.o:(.rodata._ZTI5Alien[_ZTI5Alien]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' 
intermediate/Game.o:(.rodata+0x20): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' 
../../YoghurtGum/bin/YoghurtGum.a(Sprite.o):(.rodata._ZTIN10YoghurtGum16SpriteDataOpenGLE[_ZTIN10YoghurtGum16SpriteDataOpenGLE]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' 
../../YoghurtGum/bin/YoghurtGum.a(Sprite.o):(.rodata._ZTIN10YoghurtGum10SpriteDataE[_ZTIN10YoghurtGum10SpriteDataE]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info' 
make: *** [bin/Galaxians.android] Fout 1 

這是我設法破譯的錯誤:

intermediate/Game.o: In function `Galaxians::Init()': 
/media/YoghurtGum/Tests/Galaxians/src/Game.cpp:45: undefined reference to `__cxa_end_cleanup' 
/media/YoghurtGum/Tests/Galaxians/src/Game.cpp:44: undefined reference to `__cxa_end_cleanup' 

這是第43行至45:

Assets::AddSprite(new Sprite("media\\ViperMarkII.bmp"),  "ship"); 
Assets::AddSprite(new Sprite("media\\alien.bmp"),   "alien"); 
Assets::AddSprite(new Sprite("media\\bat_ball.bmp"),  "bullet"); 

所以,我覺得有趣的是,第一個new很好(第43行),但第二個不是。什麼會造成這種情況?

intermediate/Game.o: In function `Player::Update()': 
/media/YoghurtGum/Tests/Galaxians/src/Player.h:41: undefined reference to `__cxa_end_cleanup' 

另一個問題與new

Engine::game->scene_current->AddObject(new Bullet(m_X + 10, m_Y)); 

我不知道從哪裏開始的其他問題。

這些是我的makefiles,它們是一個巨大的混亂,因爲我只是想讓它工作。

靜態庫:

# ====================================== # 
#          # 
#  YoghurtGum static library  # 
#          # 
# ====================================== # 

include ../YoghurtGum.mk 

PROGS = bin/YoghurtGum.a 
SOURCES = $(wildcard src/*.cpp) 

#$(YG_PATH_LIB)/libGLESv1_CM.so \ 
#$(YG_PATH_LIB)/libEGL.so \ 

YG_LINK_OPTIONS = -shared 
YG_LIBRARIES = \ 
    $(YG_PATH_LIB)/libc.a \ 
    $(YG_PATH_LIB)/libc.so \ 
    $(YG_PATH_LIB)/libstdc++.a \ 
    $(YG_PATH_LIB)/libstdc++.so \ 
    $(YG_PATH_LIB)/libm.a \ 
    $(YG_PATH_LIB)/libm.so \ 
    $(YG_PATH_LIB)/libui.so \ 
    $(YG_PATH_LIB)/liblog.so \ 
    $(YG_PATH_LIB)/libGLESv2.so \ 
    $(YG_PATH_LIB)/libcutils.so \ 

YG_OBJECTS = $(patsubst src/%.cpp, $(YG_INT)/%.o, $(SOURCES)) 

YG_NDK_PATH_LIB = /home/oem/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib 

all: $(PROGS) 

rebuild: clean $(PROGS) 

# remove all .o objects from intermediate and all .android objects from bin 
clean: 
    rm -f $(YG_INT)/*.o $(YG_BIN)/*.a 

copy: 
    acpy ../$(PROGS) 

$(PROGS): $(YG_OBJECTS) 
    $(YG_ARCHIVER) -vq $(PROGS) $(YG_NDK_PATH_LIB)/crtbegin_static.o $(YG_NDK_PATH_LIB)/crtend_android.o $^ && \ 
    $(YG_ARCHIVER) -vr $(PROGS) $(YG_LIBRARIES) 

$(YG_OBJECTS): $(YG_INT)/%.o : $(YG_SRC)/%.cpp 
    $(YG_COMPILER) $(YG_FLAGS) -I $(GLES_INCLUDES) -c $< -o [email protected] 

測試遊戲項目:

# ====================================== # 
#          # 
#    Galaxians    # 
#          # 
# ====================================== # 

include ../../YoghurtGum.mk 

PROGS = bin/Galaxians.android 

YG_COMPILER = arm-none-linux-gnueabi-g++ 
YG_LINKER = arm-none-linux-gnueabi-ld 
YG_PATH_LIB = ./lib/Android 
YG_LIBRARIES = ../../YoghurtGum/bin/YoghurtGum.a 

YG_PROGS = bin/Galaxians.android 
GLES_INCLUDES = ../../YoghurtGum/src 

ANDROID_NDK_ROOT = /home/oem/android-ndk-r3 
NDK_PLATFORM_VER = 5 
YG_NDK_PATH_LIB = $(ANDROID_NDK_ROOT)/build/platforms/android-$(NDK_PLATFORM_VER)/arch-arm/usr/lib 

YG_LIBS = -nostdlib -lstdc++ -lm -lGLESv1_CM 

#YG_COMPILE_OPTIONS = -g -rdynamic -Wall -Werror -O2 -w 
YG_COMPILE_OPTIONS = -g -Wall -Werror -O2 -w 
YG_LINK_OPTIONS = --entry=main -dynamic-linker=/system/bin/linker -rpath-link=$(YG_NDK_PATH_LIB) -L$(YG_NDK_PATH_LIB) $(YG_LIBS) 

SOURCES = $(wildcard src/*.cpp) 
YG_OBJECTS = $(patsubst src/%.cpp, intermediate/%.o, $(SOURCES)) 

all: $(PROGS) 

rebuild: clean $(PROGS) 

clean: 
    rm -f intermediate/*.o bin/*.android 

$(PROGS): $(YG_OBJECTS) 
    $(YG_LINKER) $(YG_LINK_OPTIONS) -rpath=$(YG_NDK_PATH_LIB) -rpath=../../YoghurtGum/lib/Android -L$(YG_PATH_LIB) $^ $(YG_LIBRARIES) -o [email protected] 

$(YG_OBJECTS): intermediate/%.o : src/%.cpp 
    $(YG_COMPILER) $(YG_COMPILE_OPTIONS) -I ../../YoghurtGum/src/GLES -I ../../YoghurtGum/src -c $< -o [email protected] 

任何幫助,將不勝感激。

回答

3

看起來你並沒有鏈接正確的C++運行時庫(它可能與libstdC++不同)。您應該嘗試使用C++編譯器來驅動鏈接器,而不是直接調用鏈接器。

如果需要通過編譯器將連接特定的選項,你可以用-Wl:

arm-none-linux-gnueabi-g++ -Wl,--entry=main -Wl,-dynamic-linker=/system/bin/linker ... 
+0

謝謝,那就是它。 :) – knight666 2010-04-19 19:12:32

1

我只是有非常類似的問題,和我同事的答案。

LOCAL_CFLAGS += -frtti 

它使鏈接器將「運行時類型信息」包括到您可能在代碼中使用的二進制文件中。