Tôi nhận được cảnh báo này khi chạy $ANDROID_NDK_ROOT/ndk-build
. Các Android.mk
là dưới đây.CẢNH BÁO: .../Android.mk: thư viện không phải hệ thống trong cờ liên kết
$ $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
...
Tuy nhiên, khi tôi làm theo hướng dẫn và loại bỏ -lcryptopp -lstlport_shared
từ LOCAL_LDLIBS
, sau đó tôi nhận được lỗi liên kết liên quan đến biểu tượng từ libstlport_shared.so
. Một mẫu lỗi được hiển thị bên dưới sau tệp Android.mk
.
Làm thế nào, chính xác, không ndk-build
muốn Android.mk
được thiết lập?
Tại sao tôi phải thêm $(STLPORT_INCL)
vào LOCAL_C_INCLUDES
và $(STLPORT_LIB)
đến LOCAL_LDFLAGS
? Tại sao APP_STL := stlport_shared
không thiết lập STL chính xác ra khỏi hộp?
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)
Đây là một ví dụ về các lỗi khi cố gắng làm theo những lời khuyên bằng cách loại bỏ các thư viện địa phương của tôi từ 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()'
...
Đây là những gì tôi không hiểu: 'LOCAL_EXPORT_C_INCLUDES: = <đường dẫn đến stlport bao gồm>'. Android cung cấp thư viện chết tiệt. Họ cung cấp một hệ thống xây dựng f ** k'd lên. Các s ** t nên được bao gồm như '--sysroot'. Thay vào đó, họ tra tấn các nhà phát triển với nó. Và họ ẩn đầu ra để bạn thậm chí không thể nhìn thấy kết quả của thử nghiệm trong khi cố gắng để có được s ** t để làm việc. – jww
Nhưng đối với lib chuẩn tôi không phải trải qua điều này (tôi đồng ý với bạn về điều đó) lộn xộn khá kinh khủng, và chỉ có 'APP_STL = gnustl_shared' trong' Application.mk' của tôi ... – JBL
Vâng, nó thậm chí còn tốt hơn. Hệ thống xây dựng f ** king từ chối sao chép các thư viện phụ thuộc (STLport và Crypto ++) vào thư mục '../ libs/armeabi'. – jww