Android NDK:无存档符号表(运行ranlib)

时间:2018-09-19 03:05:48

标签: android android-ndk java-native-interface

我正在更新项目以使用Android ndk 16b,而以前使用的是12b(工作正常)。更新后,在构建最终的.so时遇到以下错误:

/Users/ssk/code/client/git/thirdparty/android-ndk-r16b/android-ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: jni/../../../shared-library/SharedCommon/build/arm-linux-androideabi/lib/libSharedCommon.a: no archive symbol table (run ranlib)

这导致了许多链接器错误。我尝试了以下答案:

Android NDK: no archive symbol table

How to run ranlib on an archive built through Android.mk?

no archive symbol table (run ranlib) while building libcryptopp.a through ndk-build

没有运气。

3 个答案:

答案 0 :(得分:5)

您需要使用GNU AR构建静态库(就像我们在NDK中包含的库一样,与GCC位于同一目录)。达尔文的AR是不会自动执行ranlib任务的BSD AR。

答案 1 :(得分:0)

当交叉编译Android库时,我遇到类似的问题。

这个问题引起了,因为我没有为交叉编译指定ranlib工具,并且在构建系统中使用默认的x86时会回退。

在编译之前,在配置阶段将ranlib指定为arm-linux-androideabi-ranlib即可解决问题。

答案 2 :(得分:0)

对于我的一个图书馆添加

NDK=$HOME/ndk/21.3.6528147/toolchains/llvm/prebuilt/darwin-x86_64/bin/
cmake -DCMAKE_RANLIB=$NDK/x86_64-linux-android-ranlib ...

解决了这个问题。对于另一个库,它不起作用,还需要添加

-DCMAKE_C_COMPILER_RANLIB=$NDK/x86_64-linux-android-ranlib -DCMAKE_CXX_COMPILER_RANLIB=$NDK/x86_64-linux-android-ranlib ...

您可能还需要添加对 ar ndk 工具的引用

-DCMAKE_AR=$NDK/x86_64-linux-android-ar

添加 CCXX 取决于您使用的是 gcc/clang 还是 gcc++/clang++。要设置正确的编译器,请为 DCMAKE_C_COMPILER 使用 DCMAKE_CXX_COMPILERcmake 等标志。