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 на этапе настройки перед компиляцией.

Другие вопросы по тегам