【问题标题】:WARNING: .../Android.mk: non-system libraries in linker flags警告:.../Android.mk:链接器标志中的非系统库
【发布时间】:2014-10-29 02:45:52
【问题描述】:

我在运行 $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
...

但是,当我按照说明从 LOCAL_LDLIBS 中删除 -lcryptopp -lstlport_shared 时,我会收到与来自 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()'

...

【问题讨论】:

    标签: android c++ android-ndk ndk-build


    【解决方案1】:

    我将“链接器标志中的非系统库”消息解释为您没有使用默认系统库(usr/lib)的警告,这可能完全没问题,但也可能导致错误(不兼容不同库版本之间)。这个警告是否让您感到不安完全取决于您。

    然后,关于您尝试解决它的方式,我认为您错误地使用了 NDK 的 LOCAL_SHARED_LIBRARIES 变量。

    我在此处粘贴来自我的一个使用 Assimp 的 Android.mk 文件的示例

    #------------------------------------------------------------------ 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,设置了一些变量,然后包含告诉 NDK 使用此库的 PREBUILT_STATIC_LIBRARY 脚本。

    然后在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 
    

    我认为应该这样做。当然,对每个引起问题的库重复该过程,并且不要忘记每个库规范之间的include(CLEAR_VARS)

    【讨论】:

    • 这是我不明白的:LOCAL_EXPORT_C_INCLUDES := &lt;path to stlport includes&gt;。 Android 提供了该死的库。他们提供了一个完善的构建系统。 st 应该像--sysroot 一样包含在内。相反,他们用它折磨开发人员。而且它们隐藏了输出,因此您在尝试让 s**t 工作时甚至看不到实验结果。
    • 但是对于标准库,我不必经历这个(我同意你的观点)非常可怕的混乱,并且我的Application.mk 中只有一个APP_STL=gnustl_shared...
    • 是的,它变得更好了。 f**king 构建系统拒绝将依赖库(STLport 和 Crypto++)复制到../libs/armeabi 文件夹中。
    • @jww 不要小看V=1参数到ndk-build
    • ndk-build -n 还可以查看 make 将执行的所有命令的列表(不执行它们)
    猜你喜欢
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多