2014-09-04 14 views
6

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$(STLPORT_LIB) đến LOCAL_LDFLAGS? Tại sao APP_STL := stlport_sharedkhô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()' 

...

Trả lời

8

Tôi giải thích thông báo "thư viện không phải hệ thống trong cờ liên kết" là cảnh báo rằng bạn không sử dụng hệ thống mặc định librari es (trong usr/lib) có thể hoàn toàn ổn, nhưng cũng có thể dẫn đến lỗi (không tương thích giữa các phiên bản thư viện khác nhau). Cho dù lỗi cảnh báo này là hoàn toàn tùy thuộc vào bạn.

Sau đó, về cách bạn cố gắng giải quyết nó, tôi nghĩ bạn đang sử dụng sai biến số LOCAL_SHARED_LIBRARIES của NDK.

tôi dán ở đây một mẫu từ một trong những tập tin Android.mk của tôi trong đó sử dụng 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> 

Như bạn thấy, tôi tuyên bố một LOCAL_MODULE với một tên tùy chỉnh, thiết lập một vài biến và sau đó bao gồm kịch bản PREBUILT_STATIC_LIBRARY cho biết NDK sử dụng lib này.

Sau đó, trong LOCAL_STATIC_LIBRARIES Tôi liệt kê các thư viện tôi sử dụng với tên mô-đun, không giống như đây là cờ liên kết như bạn đang làm ở đây.

Trong trường hợp của bạn, tôi tin rằng bạn nên làm như sau, ví dụ cho 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 

Tôi nghĩ rằng điều này sẽ làm điều đó. Tất nhiên, lặp lại quá trình cho mỗi libs gây rắc rối, và đừng quên include(CLEAR_VARS) giữa mỗi đặc tả lib.

+1

Đâ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

+0

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

+0

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

Các vấn đề liên quan