将静态库libm.a或libc.a与NDK cmake链接

时间:2016-10-11 17:10:25

标签: android c++ android-ndk cmake clang

在Android Studio中使用NDK Cmake构建系统时,是否可以链接平台\ android-XX \ arch-arm \ usr \ lib * .a版本的库?我正在使用LLVM工具链和Android NDK 13。

我尝试过对示例应用进行修改,更改文件:https://github.com/googlesamples/android-ndk/blob/master-cmake/hello-jni/app/src/main/cpp/CMakeLists.txt

进行以下修改(添加libm.a):

target_link_libraries(hello-jni libm.a android log)

构建成功,但readelf -d显示libm.so仍然链接:

 0x00000001 (NEEDED)                     Shared library: [libandroid.so]
 0x00000001 (NEEDED)                     Shared library: [liblog.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]

当添加libc.a时,情况会变得更糟,构建失败:

Error:error: relocation overflow in R_ARM_THM_JUMP11
Error:error: linker command failed with exit code 1 (use -v to see invocation)
顺便说一句,有时我只看到最后一个错误而没有任何解释(例如,拼写错误的库名称时)。我应该设置-v标志somehwere以查看更多详细信息?怎么做?

1 个答案:

答案 0 :(得分:1)

如果你只是想让它编译,我会尝试使用arm-linux-androideabi-gcc而不是clang。我意识到gcc是折旧的。但是,如果您的目标是编译或理解问题,我不能。从丹的评论来看,我假设他不相信他在aosp评论的任何旗帜都会有所帮助(见下面的链接)

https://android.googlesource.com/platform/build/+/master/core/clang/config.mk

FWIW,我倾向于总是使用来自aosp / bionic构建的静态库,因为我处理了许多需要它们的东西。在sdk版本之间的仿生libc中包含的符号往往存在太多的不一致性,并且在大多数情况下静态链接其所需的libc.a。如果您打算使用静态libc的ndk版本,我建议使用平台21而不是24。

我认为,由于Android是如此碎片化,并且所有设备使用不同的libc.so,libdl.so等,它不会导致太多问题。

编辑:误读了这个问题。