2014-09-04 20 views
6

Viene visualizzato questo avviso durante l'esecuzione di $ANDROID_NDK_ROOT/ndk-build. Il Android.mk è sotto.AVVISO: .../Android.mk: librerie non di sistema in flag di linker

$ $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 
... 

Tuttavia, quando seguo le istruzioni e rimuovere -lcryptopp -lstlport_shared da LOCAL_LDLIBS, allora ottengo errori di collegamento relativi simboli da libstlport_shared.so. Di seguito è riportato un esempio degli errori dopo il file Android.mk.

Come, esattamente, ndk-build desidera Android.mk impostato?

Perché devo aggiungere $(STLPORT_INCL) a LOCAL_C_INCLUDES e $(STLPORT_LIB) a LOCAL_LDFLAGS? Perché APP_STL := stlport_sharednon impostare correttamente l'STL fuori dalla scatola?


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) 

Ecco un esempio di errore quando si cerca di seguire il consiglio rimuovendo le mie biblioteche locali da 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()' 

...

risposta

8

interpreto il messaggio "librerie non di sistema in linker flags" come avviso che non stai utilizzando il librerie di sistema predefinito es (in usr/lib) che può essere perfettamente a posto, ma che potrebbe anche portare a errori (incompatibilità tra versioni di librerie diverse). Se questo avviso ti infastidisce dipende completamente da te.

Poi, per come hai provato a risolverlo, penso che stai usando erroneamente la variabile LOCAL_SHARED_LIBRARIES dell'NDK.

incollo qui un campione da uno dei miei file di Android.mk che utilizza 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> 

Come potete vedere, dichiaro un LOCAL_MODULE con un nome personalizzato, impostare alcune variabili e quindi includere lo script PREBUILT_STATIC_LIBRARY che dice al NDK di usare questa lib.

Poi nel LOCAL_STATIC_LIBRARIES I Elenco delle librerie che uso con il loro nome del modulo, non come se questa fosse una bandiera linker come si sta facendo qui.

Nel tuo caso, credo che si dovrebbe fare quanto segue, ad esempio per la 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 

Penso che questo dovrebbe farlo. Ovviamente, ripetere il processo per ogni lib che causa problemi e non dimenticare lo include(CLEAR_VARS) tra ogni specifica lib.

+1

Questo è quello che non capisco: 'LOCAL_EXPORT_C_INCLUDES: = '. Android fornisce la dannata libreria. Forniscono un sistema di costruzione f ** k'd up. Il s ** t dovrebbe essere incluso come '--sysroot'. Invece, torturano gli sviluppatori con esso. E nascondono l'output in modo che non si possano nemmeno vedere i risultati della sperimentazione mentre si cerca di far funzionare il s ** t. – jww

+0

Ma per la lib standard non devo passare questo (sono d'accordo con te su questo) un pasticcio abbastanza orribile, e ho solo un 'APP_STL = gnustl_shared' nel mio' Application.mk' ... – JBL

+0

Sì, lo diventa ancora meglio Il sistema f ** king build rifiuta di copiare le librerie dipendenti (STLport e Crypto ++) nella cartella '../ libs/armeabi'. – jww

Problemi correlati