ПРЕДУПРЕЖДЕНИЕ: … / Android.mk: несистемные библиотеки в флагах компоновщика

Я получаю это предупреждение при запуске $ANDROID_NDK_ROOT/ndk-build . 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()' 

Я интерпретирую сообщение «несистемные библиотеки в флагах компоновщика» как предупреждение о том, что вы не используете системные библиотеки по умолчанию (в usr/lib ), которые могут быть совершенно точными, но которые также могут привести к ошибкам (несовместимость между различными библиотеками версии). Означает ли это предупреждение, что вы полностью зависите от вас.

Затем, о том, как вы пытались его решить, я думаю, вы ошибочно LOCAL_SHARED_LIBRARIES переменную 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 скрипт 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 

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