找不到-lgnustl_static:使用NDK r7编译Android SDL端口

时间:2012-01-10 17:20:39

标签: android stl android-ndk sdl ld

我正在尝试使用新的Android NDK r7版本为Android构建此libSDL端口:

https://github.com/pelya/commandergenius

我知道我在某种程度上做了一些事情"不支持":我正在使用cygwin& windows尽管在README中被提及不再受支持。话虽这么说,我可以破解shell脚本并在必要时解决我的问题并编译但不能链接。

所以无论如何我一直在编译工作直到链接(抱歉大块,相关部分修剪如下):

/cygdrive/c/and/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-ar crs obj/local/armeabi/libflac.a ./obj/local/armeabi/objs-debug/flac/src/ogg_decoder_aspect.o ./obj/local/armeabi/objs-debug/flac/src/md5.o ./obj/local/armeabi/objs-debug/flac/src/stream_decoder.o ./obj/local/armeabi/objs-debug/flac/src/fixed.o ./obj/local/armeabi/objs-debug/flac/src/memory.o ./obj/local/armeabi/objs-debug/flac/src/stream_encoder.o ./obj/local/armeabi/objs-debug/flac/src/window.o ./obj/local/armeabi/objs-debug/flac/src/cpu.o ./obj/local/armeabi/objs-debug/flac/src/ogg_encoder_aspect.o ./obj/local/armeabi/objs-debug/flac/src/lpc.o ./obj/local/armeabi/objs-debug/flac/src/float.o ./obj/local/armeabi/objs-debug/flac/src/bitmath.o ./obj/local/armeabi/objs-debug/flac/src/metadata_object.o ./obj/local/armeabi/objs-debug/flac/src/ogg_helper.o ./obj/local/armeabi/objs-debug/flac/src/metadata_iterators.o ./obj/local/armeabi/objs-debug/flac/src/bitreader.o ./obj/local/armeabi/objs-debug/flac/src/bitwriter.o ./obj/local/armeabi/objs-debug/flac/src/stream_encoder_framing.o ./obj/local/armeabi/objs-debug/flac/src/crc.o ./obj/local/armeabi/objs-debug/flac/src/format.o ./obj/local/armeabi/objs-debug/flac/src/ogg_mapping.o
C:/and/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld.exe: cannot find -lgnustl_static
collect2: ld returned 1 exit status
/cygdrive/c/and/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-ar crs obj/local/armeabi-v7a/libflac.a ./obj/local/armeabi-v7a/objs-debug/flac/src/ogg_decoder_aspect.o ./obj/local/armeabi-v7a/objs-debug/flac/src/md5.o ./obj/local/armeabi-v7a/objs-debug/flac/src/stream_decoder.o ./obj/local/armeabi-v7a/objs-debug/flac/src/fixed.o ./obj/local/armeabi-v7a/objs-debug/flac/src/memory.o ./obj/local/armeabi-v7a/objs-debug/flac/src/stream_encoder.o ./obj/local/armeabi-v7a/objs-debug/flac/src/window.o ./obj/local/armeabi-v7a/objs-debug/flac/src/cpu.o ./obj/local/armeabi-v7a/objs-debug/flac/src/ogg_encoder_aspect.o ./obj/local/armeabi-v7a/objs-debug/flac/src/lpc.o ./obj/local/armeabi-v7a/objs-debug/flac/src/float.o ./obj/local/armeabi-v7a/objs-debug/flac/src/bitmath.o ./obj/local/armeabi-v7a/objs-debug/flac/src/metadata_object.o ./obj/local/armeabi-v7a/objs-debug/flac/src/ogg_helper.o ./obj/local/armeabi-v7a/objs-debug/flac/src/metadata_iterators.o ./obj/local/armeabi-v7a/objs-debug/flac/src/bitreader.o ./obj/local/armeabi-v7a/objs-debug/flac/src/bitwriter.o ./obj/local/armeabi-v7a/objs-debug/flac/src/stream_encoder_framing.o ./obj/local/armeabi-v7a/objs-debug/flac/src/crc.o ./obj/local/armeabi-v7a/objs-debug/flac/src/format.o ./obj/local/armeabi-v7a/objs-debug/flac/src/ogg_mapping.o
C:/and/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld.exe: cannot find -lgnustl_static
collect2: ld returned 1 exit status

相关失败,如果你无法解析那一面文字:

ld.exe: cannot find -lgnustl_static

现在,如果我查看Windows NDK版本,我会在这里找到gnustl_ *文件:

下的./android-ndk-r7/sources:

./cxx-stl/gnu-libstdc++/libs/armeabi/libgnustl_shared.so
./cxx-stl/gnu-libstdc++/libs/armeabi/libgnustl_static.a
./cxx-stl/gnu-libstdc++/libs/armeabi-v7a/libgnustl_shared.so
./cxx-stl/gnu-libstdc++/libs/armeabi-v7a/libgnustl_static.a
./cxx-stl/gnu-libstdc++/libs/x86/libgnustl_shared.so
./cxx-stl/gnu-libstdc++/libs/x86/libgnustl_static.a

我还查看了linux android NDK发行版,它们的打包方式相同(只有libgnustl文件,在sources目录下构建)。

所以我有3个问题:

  • 为什么我们会使用-l链接libgnustl_static,当它是.a时 文件?不应该只是在对象中包含.a文件 列表,或者可选地是-lgnustl_shared?
  • 为什么这些文件仅在"来源"?我希望他们能够进入"工具链"库NDK目录。有人如何链接libgnustl?
  • 我可以将这些文件复制到链接器可以看到的位置吗?只使用-L添加他们的目录似乎没有用,而且我需要获得与正确的构建目标相关联的正确版本(armeabi vs armeabi-v7 vs x86)

2 个答案:

答案 0 :(得分:3)

这是gcc / NDK中的一个错误,它在Linux,Cygwin和Windows(非Cygwin)上略有不同。

以下是我修复它的方法(适用于Linux以及我的盲人开发人员之一,必须使用Cygwin)...

  • 从您的APP_STL := gnustl_static中删除显示Application.mk的行(它在NDK中已断开,在Linux Cygwin,Windows上略有不同)
  • $(LOCAL_LDLIBS)文件中的Android.mk添加一行说明:

    $(NDK_ROOT)/源/ CXX-STL / GNU-的libstdc ++ / 4.6 /库/ armeabi-V7A / libgnustl_static.a

还要向Android.mk添加两行说:

LOCAL_C_INCLUDES := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/include
LOCAL_C_INCLUDES += $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include

上述内容将实现您APP_STL := gnustl_staticApplication.mk所应具备的内容。

答案 1 :(得分:2)

如果这困扰任何其他人,解决方案是删除-lgnustl_static而不是列表 链接器命令中的c:\ path \ to \ armeabi \ libs \ libgnustl_static.a。

不要使用/ cygdrive样式路径,因为链接器将无法找到该文件。使用实际的c:\ ...