在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以查看更多详细信息?怎么做?
答案 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等,它不会导致太多问题。
编辑:误读了这个问题。