我正在更新项目以使用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
没有运气。
答案 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
添加 C
或 CXX
取决于您使用的是 gcc/clang 还是 gcc++/clang++。要设置正确的编译器,请为 DCMAKE_C_COMPILER
使用 DCMAKE_CXX_COMPILER
或 cmake
等标志。