2014-09-04 2 views
6

Я получаю это предупреждение во время работы $ANDROID_NDK_ROOT/ndk-build. Ниже находится Android.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 
... 

Однако, когда я следовать инструкциям, и удалить -lcryptopp -lstlport_shared из LOCAL_LDLIBS, то я получаю ошибки ссылки, связанные с символами из 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), который может быть совершенно точным, но также может привести к ошибкам (несовместимость между версиями разных библиотек). Означает ли это предупреждение, что вы полностью зависите от вас.

Тогда, о том, как вы пытались его решить, я думаю, вы неправильно используете переменную LOCAL_SHARED_LIBRARIES NDK.

я вставляю здесь образец одного из моих Android.mk файла, который использует 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> 

Как вы можете видеть, я объявляю LOCAL_MODULE с пользовательским именем, установить несколько переменных, а затем включить PREBUILT_STATIC_LIBRARY сценарий который говорит NDK использовать эту библиотеку.

Затем в LOCAL_STATIC_LIBRARIES Я перечисляю библиотеки, которые я использую , с их именем модуля, но не так, как если бы это был флаг компоновщика, как вы здесь.

В вашем случае, я полагаю, вы должны сделать следующее, например, для СТЛА

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 

Я думаю, что это должно сделать это. Конечно, повторите процесс для каждого libs, который вызывает проблемы, и не забывайте include(CLEAR_VARS) между каждой спецификацией lib.

+1

Это то, что я не понимаю: 'LOCAL_EXPORT_C_INCLUDES: = <путь к stlport includes>'. Android поставляет проклятую библиотеку. Они обеспечивают систему сборки f ** k'd up. S ** t следует включить как '--sysroot'. Вместо этого они мучают разработчиков этим. И они скрывают вывод, поэтому вы даже не можете увидеть результаты эксперимента, пытаясь заставить s ** t работать. – jww

+0

Но для стандартной библиотеки мне не нужно проходить через это (я с тобой согласен с этим) довольно ужасный беспорядок, и у меня есть 'APP_STL = gnustl_shared' в моем' Application.mk' ... – JBL

+0

Да, это становится еще лучше. Система сборки f ** king отказывается копировать зависимые библиотеки (STLport и Crypto ++) в папку '../ libs/armeabi'. – jww

Смежные вопросы