2012-12-13 39 views
4

我在我的Native應用程序中鏈接STL時遇到了一些問題。在使用其他地圖功能成功時,鏈接失敗時會同時使用map :: operator []和map :: insert。 我Application.mk是:std :: map鏈接器錯誤ndk r8c與APP_STL:= gnustl_static

APP_STL := gnustl_static 
APP_CPPFLAGS := -fexceptions -frtti 
APP_CPPFLAGS += -g3 
APP_CPPFLAGS += -DDEBUG 
APP_ABI := armeabi-v7a 
APP_PLATFORM:=android-14 
NDK_TOOLCHAIN_VERSION:=4.6 

本機代碼包含兩個文件夾中。我爲每個內部文件夾創建一個Android.mk文件來編譯並生成一個靜態庫。我在最深的文件夾中使用std :: map。 Android.mk的樣子:

TEMP_PATH_REG := $(call my-dir) 
LOCAL_PATH := $(TEMP_PATH_REG) 
include $(call all-subdir-makefiles) 
LOCAL_PATH := $(TEMP_PATH_REG) 
include $(CLEAR_VARS) 

LOCAL_MODULE   := registration 
LOCAL_C_INCLUDES  := $(LOCAL_PATH)/../glm/ 
LOCAL_SRC_FILES  := registration_factory.cpp \ 
              inertial.cpp          
LOCAL_LDLIBS    := -llog -landroid -lEGL 
LOCAL_STATIC_LIBRARIES  := android_native_app_glue 
include $(BUILD_STATIC_LIBRARY) 
$(call import-module,android/native_app_glue) 

當我建的項目,我得到以下錯誤:

~/.android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/libregistration.a(registration_factory.o): in function std::_Rb_tree<int, std::pair<int const, xmar::IRegistration*>, std::_Select1st<std::pair<int const, xmar::IRegistration*> >, std::less<int>, std::allocator<std::pair<int const, xmar::IRegistration*> > >::_M_insert_(std::_Rb_tree_node_base const*, std::_Rb_tree_node_base const*, std::pair<int const, xmar::IRegistration*> const&):~/.android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h:1013: error: undefined reference to 'std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)' 
StaticLibrary : libandroid_native_app_glue.a 
rm -f obj/local/armeabi-v7a/libandroid_native_app_glue.a 
~/.android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/libregistration.a(registration_factory.o): in function std::_Rb_tree_const_iterator<std::pair<int const, xmar::IRegistration*> >::operator--():~/.android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h:284: error: undefined reference to 'std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)' 
~/.android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-ar crs ./obj/local/armeabi-v7a/libandroid_native_app_glue.a ./obj/local/armeabi-v7a/objs-debug/android_native_app_glue/android_native_app_glue.o 
~/.android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/libregistration.a(registration_factory.o): in function std::_Rb_tree_const_iterator<std::pair<int const, xmar::IRegistration*> >::operator++():~/.android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h:269: error: undefined reference to 'std::_Rb_tree_increment(std::_Rb_tree_node_base const*)' 
Prebuilt  : libgnustl_static.a <= <NDK>/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/ 
~/.android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/libregistration.a(registration_factory.o): in function std::_Rb_tree_iterator<std::pair<int const, xmar::IRegistration*> >::operator--():~/.android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h:203: error: undefined reference to 'std::_Rb_tree_decrement(std::_Rb_tree_node_base*)' 

什麼我多伊格錯了嗎?

非常感謝。

回答

4

我找到了解決方案來編譯項目。

LOCAL_LDLIBS += ~/.android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/libsupc++.a 
LOCAL_LDLIBS += ~/.android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/libgnustl_static.a