Android NDK: нет таблицы символов архива (запустите ranlib)
Я обновляю свои проекты, чтобы использовать 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: нет таблицы символов архива
Как запустить ranlib для архива, созданного через Android.mk?
нет таблицы символов архива (запустите ranlib) при сборке libcryptopp.a через ndk-build
без удачи
3 ответа
Вам нужно создавать статические библиотеки с помощью GNU AR (например, ту, которую мы включаем в NDK, в том же каталоге, что и GCC). AR Дарвина является AR BSD, который не выполняет автоматически задачи ranlib.
Для одной из моих библиотек добавление
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
инструмент ндк
-DCMAKE_AR=$NDK/x86_64-linux-android-ar
Добавление
C
или
CXX
зависит от того, что вы используете gcc/clang или gcc++/clang++. Чтобы установить правильный компилятор, используйте такие флаги, как
DCMAKE_C_COMPILER
или
DCMAKE_CXX_COMPILER
за
cmake
.
При кросс-компиляции библиотеки для android сталкиваюсь с аналогичной проблемой.
Проблема возникает из-за того, что я не указал инструмент ranlib для кросс-компиляции, и он отказался от использования инструмента по умолчанию в системе сборки, который является x86.
Проблема решена указанием ранлиб для arm-linux-androideabi-ranlib
на этапе настройки перед компиляцией.