WARNING: .../Android.mk: non-system libraries in linker flags

19,916

I interpret the "non-system libraries in linker flags" message as a warning that you're not using the default system libraries (in usr/lib) which may be perfectly fine, but which could also lead to errors (incompatibility between different libraries versions). Whether this warning bugs you is completely up to you.

Then, about the way you tried to solve it, I think you're using wrongly the LOCAL_SHARED_LIBRARIES variable of the NDK.

I paste here a sample from one of my Android.mk file which uses 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>

As you can see, I declare a LOCAL_MODULE with a custom name, set up a few variables and then include the PREBUILT_STATIC_LIBRARY script which tells the NDK to use this lib.

Then in LOCAL_STATIC_LIBRARIES I list the libraries I use with their module name, not as if this was a linker flag like you're doing here.

In your case, I believe you should do the following, for example for the 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 

I think this should do it. Of course, repeat the process for each libs that causes trouble, and don't forget the include(CLEAR_VARS) between each lib specification.

Share:
19,916
jww
Author by

jww

Updated on July 05, 2022

Comments

  • jww
    jww almost 2 years

    I'm getting this warning while running $ANDROID_NDK_ROOT/ndk-build. The Android.mk is below.

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

    However, when I follow the instructions and remove -lcryptopp -lstlport_shared from LOCAL_LDLIBS, then I get link errors related to symbols from libstlport_shared.so. A sample of the errors are shown below after the Android.mk file.

    How, exactly, does ndk-build want Android.mk set up?

    Why do I have to add $(STLPORT_INCL) to LOCAL_C_INCLUDES, and $(STLPORT_LIB) to LOCAL_LDFLAGS? Why does APP_STL := stlport_shared not setup the STL correctly out of the box?


    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)
    

    Here is a sample of the error when trying to follow the advice by removing my local libraries from 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()'
    

    ...