警告:/Android.mk:链接器标志中的非系统库
WARNING: .../Android.mk: non-system libraries in linker flags
运行$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()'
我将"链接器标志中的非系统库"消息解释为没有使用默认系统库(在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
,设置了几个变量,然后包含了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
我认为应该这样做。当然,对每个引起麻烦的库重复这个过程,不要忘记每个库规范之间的include(CLEAR_VARS)
。
- 实验性文件系统库不完整C++?
- 无法链接文件系统库C++
- 无法识别 Mac c++ 文件系统库
- 获取 clang++:错误:在编译文件系统库的代码时
- 如果 copts 不允许系统路径,如何引用外部依赖项使用的系统库?
- 从 make 调用 CMake 以获取系统库路径
- 如何在cmake中的源文件之后设置库标志?
- 如何使用文件系统库获取"true"文件大小?(C++17)
- 如何在没有系统/库的情况下控制GPIO
- 如何使用 c++ 文件系统库将文件复制到另一个目录
- 如何在Bazel中静态链接系统库
- GCC 显示系统库中的错误.-iSystem 不起作用
- 使用boost ::文件系统库中的输出中的奇怪字符
- libstdc++ 系统库在 OpenBSD 和 FreeBSD 上没有剥离
- SWIG - C ++到Python.链接系统库
- 我无法编译文件系统库
- 是否有C++轻量级跨平台文件系统库
- 如何强制使用本地共享库而不是系统库
- 是否可以在系统库标题中添加Whitespace
- 警告:/Android.mk:链接器标志中的非系统库