警告:.../Android.mk:链接器标志中的非系统库 [英] WARNING: .../Android.mk: non-system libraries in linker flags
问题描述
我在运行 $ANDROID_NDK_ROOT/ndk-build
时收到此警告.Android.mk
如下.
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
...
但是,当我按照说明从 LOCAL_LDLIBS
中删除 -lcryptopp -lstlport_shared
时,我会收到与 libstlport_shared.so 中的符号相关的链接错误
代码>.Android.mk
文件之后的错误示例如下所示.
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.
ndk-build
究竟要如何设置 Android.mk
?
为什么我必须将 $(STLPORT_INCL)
添加到 LOCAL_C_INCLUDES
,并将 $(STLPORT_LIB)
添加到 LOCAL_LDFLAGS
?为什么APP_STL := stlport_shared
没有开箱即用地正确设置 STL?
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)
<小时>
以下是尝试通过从 LOCAL_LDLIBS
中删除我的本地库来遵循建议时的错误示例:
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()'
...
推荐答案
我将链接器标志中的非系统库"消息解释为您没有使用默认系统库(在 usr/lib
) 这可能非常好,但也可能导致错误(不同库版本之间的不兼容).这个警告是否让您感到不安完全取决于您.
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.
然后,关于您尝试解决它的方式,我认为您错误地使用了 NDK 的 LOCAL_SHARED_LIBRARIES
变量.
Then, about the way you tried to solve it, I think you're using wrongly the LOCAL_SHARED_LIBRARIES
variable of the NDK.
我从我的一个使用 Assimp 的 Android.mk
文件中粘贴了一个示例
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>
如您所见,我用自定义名称声明了一个 LOCAL_MODULE
,设置了一些变量,然后包含告诉 NDK 使用此库的 PREBUILT_STATIC_LIBRARY
脚本.
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.
然后在 LOCAL_STATIC_LIBRARIES
中列出我使用的库及其模块名称,而不是像您在这里所做的那样是链接器标志.
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.
在你的情况下,我相信你应该做以下事情,例如对于 stl
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
我认为应该这样做.当然,对每个引起问题的库重复这个过程,不要忘记每个库规范之间的include(CLEAR_VARS)
.
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.
这篇关于警告:.../Android.mk:链接器标志中的非系统库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!