2014-09-04 76 views
6

運行時出現此警告$ANDROID_NDK_ROOT/ndk-buildAndroid.mk如下。警告:.../Android.mk:鏈接器標記中的非系統庫

$ $ANDROID_NDK_ROOT/ndk-build 

WARNING:/Users/jwalton/Android-CryptoPP/jni/Android.mk:prng: 
    non-system libraries in linker flags: -lcryptopp -lstlport_shared  
    This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES  
    or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the 
    current module 
... 

然而,當我按照說明進行操作,並從LOCAL_LDLIBS刪除-lcryptopp -lstlport_shared,然後我得到libstlport_shared.so與符號相關鏈接錯誤。在Android.mk文件後面顯示了一個錯誤示例。

準確地說ndk-build想要Android.mk設置?

爲什麼我必須添加$(STLPORT_INCL)LOCAL_C_INCLUDES$(STLPORT_LIB)LOCAL_LDFLAGS?爲什麼APP_STL := stlport_shared不是正確設置STL開箱即用?


LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

TARGET_ARCH_ABI := armeabi 
TARGET_ABI  := android-9-armeabi 

CRYPTOPP_INCL := /usr/local/cryptopp-android-9/include 
CRYPTOPP_LIB := /usr/local/cryptopp-android-9/lib 

STLPORT_INCL := /opt/android-ndk-r9/sources/cxx-stl/stlport/stlport 
STLPORT_LIB  := /opt/android-ndk-r9/sources/cxx-stl/stlport/libs/armeabi 

APP_STL   := stlport_shared 
APP_MODULES  := stlport_shared cryptopp 

LOCAL_CPP_FEATURES := rtti exceptions 

LOCAL_C_INCLUDES := $(CRYPTOPP_INCL) $(CRYPTOPP_INCL)/cryptopp $(STLPORT_INCL) 

LOCAL_LDFLAGS := -L $(CRYPTOPP_LIB) -L $(STLPORT_LIB) 
LOCAL_LDLIBS := -lcryptopp -lstlport_shared -llog -landroid 
# LOCAL_LDLIBS := -llog -landroid 
# LOCAL_SHARED_LIBRARIES := -lcryptopp -lstlport_shared 

LOCAL_MODULE := prng 
LOCAL_SRC_FILES := libprng.cpp 

include $(BUILD_SHARED_LIBRARY) 

以下是錯誤的試圖通過刪除我的本地庫從LOCAL_LDLIBS照做當樣品:

$ $ANDROID_NDK_ROOT/ndk-build 
Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 9 in /Users/jwalton/Android-CryptoPP/AndroidManifest.xml  
Gdbserver  : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver 
Gdbsetup  : libs/armeabi/gdb.setup 
Compile++ thumb : prng <= libprng.cpp 
SharedLibrary : libprng.so 
/opt/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /Users/jwalton/Android-CryptoPP/obj/local/armeabi/objs-debug/prng/libprng.o: in function std::__node_alloc::allocate(unsigned int&):/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/stl/_alloc.h:158: error: undefined reference to 'std::__node_alloc::_M_allocate(unsigned int&)' 
/opt/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /Users/jwalton/Android-CryptoPP/obj/local/armeabi/objs-debug/prng/libprng.o: in function std::__node_alloc::deallocate(void*, unsigned int):/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/stl/_alloc.h:161: error: undefined reference to 'std::__node_alloc::_M_deallocate(void*, unsigned int)' 
/opt/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /Users/jwalton/Android-CryptoPP/obj/local/armeabi/objs-debug/prng/libprng.o: in function std::ios_base::_M_check_exception_mask():/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/stl/_ios_base.h:193: error: undefined reference to 'std::ios_base::_M_throw_failure()' 

...

回答

8

我解釋「鏈接器標誌中的非系統庫」消息,作爲您未使用默認系統庫的警告es(在usr/lib)這可能是完美的,但也可能導致錯誤(不同的庫版本之間的不兼容)。這個警告是否會引起你的錯誤完全取決於你。

然後,關於你試圖解決它的方式,我想你錯誤地使用了NDK的LOCAL_SHARED_LIBRARIES變量。

我貼在這裏的樣品從使用Assimp

#------------------------------------------------------------------ Assimp 
include $(CLEAR_VARS) 

LOCAL_MODULE := Assimp 
LOCAL_EXPORT_C_INCLUDES := $(GENERATED_INCLUDE_PATH)/assimp/include 
LOCAL_SRC_FILES := $(GENERATED_PATH)/assimp/lib/libassimp.a 

include $(PREBUILT_STATIC_LIBRARY) 

... 

LOCAL_STATIC_LIBRARIES := \ 
Assimp \ 
<Your other libs here> 

Android.mk文件之一,因爲你可以看到,我宣佈一個LOCAL_MODULE使用自定義名稱,設置幾個變量,然後包括PREBUILT_STATIC_LIBRARY腳本它告訴NDK使用這個庫。

然後在LOCAL_STATIC_LIBRARIES我列出了我使用的庫與他們的模塊名稱,而不是像這是一個鏈接器標誌,就像你在這裏做的。

在你的情況,我相信你應該做到以下幾點,例如用於STL的

include $(CLEAR_VARS) 

LOCAL_MODULE := STLPortShared 
LOCAL_EXPORT_C_INCLUDES := <path to stlport includes> 
LOCAL_SRC_FILES := <path to stlport library> 

include $(PREBUILT_SHARED_LIBRARY) 

... 
#Notice the name, identical to the one specified for LOCAL_MODULE 
LOCAL_SHARED_LIBRARIES = STLPortShared 

我想這應該這樣做。當然,重複每個導致問題的庫的過程,並且不要忘記每個lib規範之間的include(CLEAR_VARS)

+1

這是我不明白的:'LOCAL_EXPORT_C_INCLUDES:= '。 Android提供該死的圖書館。他們提供了一個完整的構建系統。 s ** t應該像'--sysroot'一樣包含在內。相反,他們用它來折磨開發者。他們隱藏了輸出,所以你甚至無法看到實驗的結果,同時試圖讓s ** t工作。 – jww 2014-09-04 12:44:28

+0

但是對於標準庫我不必經過這個(我同意你的說法)相當可怕的混亂,並且在我的'Application.mk'中只有'APP_STL = gnustl_shared' ... – JBL 2014-09-04 12:51:55

+0

是的,它變得更好。 f ** king構建系統拒絕將依賴庫(STLport和Crypto ++)複製到'../ libs/armeabi'文件夾中。 – jww 2014-09-04 13:34:01