Сборка библиотеки C (FFmpeg) с Android NDK r17: неопределенная ссылка на __mulodi4 - PullRequest
0 голосов
/ 11 мая 2018

Моя проблема связана с FFmpeg, но я подозреваю, что это произойдет практически с любой библиотекой C.

Описание проблемы

Мое приложение использует FFmpeg, скомпилированный с NDK r10e.Я пытаюсь обновить все до NDK r17, одновременно переключаясь на clang, так как Google предпочитает использовать это вместо gcc.

Мой первый шаг - просто построить FFmpeg.

Для этого я использовал скрипт make_standalone_toolchain.py для создания автономной цепочки инструментов для архитектуры x86, например:

make_standalone_toolchain.py --arch x86 --api 21 --install-dir ~/Development/ndk-toolchains/x86

Затем я настраиваю сборку FFmpeg следующим образом:

TOOLCHAIN_DIR=~/Development/ndk-toolchains/x86

./configure \
--prefix=$(pwd)/android/x86 \
--cross-prefix=$TOOLCHAIN_DIR/bin/i686-linux-android- \
--target-os=android \
--arch=x86 \
--enable-cross-compile \
--disable-asm \
--toolchain=clang-usan \
--disable-stripping \
--extra-cflags="-m32" \
--sysroot=$TOOLCHAIN_DIR/sysroot/

И затем я строю ее следующим образом:

make clean
make -j4
make install

Кажется, что все прекрасно, но яполучить несколько ошибок компоновщика, которые все говорят одно и то же:

неопределенная ссылка на '__mulodi4'

Решения, которые я пробовал

1.Связывание с libclang_rt.builtins *

Я обнаружил несколько мест в Интернете, которые предположили, что это связано с тем, что libgcc не предоставляет __mulodi4.Пользователь github с именем sitofe был достаточно хорош, чтобы опубликовать обходной здесь .Тем не менее, я уверен, где найти эту библиотеку libclang_rt.builtins-i686.a.Вот что я смог найти в своей автономной директории:

. / Lib64 / clang / 6.0.2 / lib / linux / libclang_rt.builtins-x86_64.a ./lib64/clang/6.0.2 / lib / linux / libclang_rt.builtins-i386.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-aarch64-android.a ./lib64/clang/6.0.2/lib/linux / libclang_rt.builtins-mips64-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-x86_64-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-i686-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-arm-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-mips-android.a

Библиотека libclang_rt.builtins-i686-android.a выглядит близко, но (я думаю) без сигары.Когда я пытаюсь связаться с ним, я получаю ту же ошибку:

неопределенная ссылка на '__mulodi4'

Вот моя новая команда конфигурации сборки FFmpeg:

./configure \
--prefix=$(pwd)/android/x86 \
--cross-prefix=$TOOLCHAIN_DIR/bin/i686-linux-android- \
--target-os=android \
--arch=x86 \
--enable-cross-compile \
--disable-asm \
--toolchain=clang-usan \
--disable-stripping \
--extra-cflags="-m32" \
--extra-ldflags="-L${TOOLCHAIN_DIR}/lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-i686-android.a" \
--sysroot=$TOOLCHAIN_DIR/sysroot/

Я проверил с помощью -v, чтобы убедиться, что эта строка была добавлена ​​к флагам компоновщика, и это было.Однако я понятия не имею, следует ли ожидать, что эта библиотека будет работать, не говоря уже о том, правильно ли я добавляю ее в флаги компоновщика.В любом случае, то, что я здесь делаю, не работает.

2.Переключение на другое дезинфицирующее средство

Вместо того, чтобы использовать неопределенное дезинфицирующее средство, я попытался переключиться на адресное дезинфицирующее средство.Это (откровенно) полный удар в темноте, основанный на смутном упоминании о том, что asan будет доступен в r17 на Google I / O на этой неделе.

В этом случае FFmpeg прекрасно работает!

Однако, когда я пытаюсь вставить FFmpeg в свой тестовый проект (простая поддержка AAR w / C ++, в которой только один метод jni вызывает av_gettime(), я получаю массу ошибок компоновщика:

Ошибка: ошибка: неопределенная ссылка на '__asan_option_detect_stack_use_after_return'
Ошибка: ошибка: неопределенная ссылка на '__asan_stack_malloc_0'
Ошибка: ошибка: неопределенная ссылка на '__asan_report_load4'
Ошибка: ошибка: ошибка: неопределенная: ошибка:ссылка на '__asan_report_load4'
Ошибка: ошибка: неопределенная ссылка на '__asan_shadow_memory_dynamic_address'
Ошибка: ошибка: неопределенная ссылка на '__asan_option_detect_stack_use_after_return'
Ошибка: ошибка: неопределенная ссылка на ____: неопределенная ссылка на __asan_report_load4
Ошибка: ошибка: неопределенная ссылка на __asan_report_load4
Ошибка: ошибка: неопределенная ссылка на __asan_shadow_memory_dynamic_address '
Ошибка: ошибка: неопределенная ссылка на __asan_option_dectrn '
Ошибка: ошибка: неопределенная ссылка на' __asan_stack_malloc_0 '
Ошибка: ошибка: неопределенная ссылка на' __asan_report_store4 '
Ошибка: ошибка: неопределенная ссылка на' __asan_report_store4 '
Ошибка: ошибка: неопределенная ссылкана __asan_init
Ошибка: ошибка: неопределенная ссылка на '__asan_version_mismatch_check_v9'

Так что, похоже, библиотека FFmpeg просто отлично находит, что указывает на то, что эта часть моего файла CMake верна, но она не может найти ни одну из этихссылки asan.

Кажется, это обычная проблема, с которой сталкиваются люди, но я не могу найти обходной путь, который действительно работает для меня.

1 Ответ

0 голосов
/ 14 мая 2018

Краткий ответ: обновление до NDK r17.

Это упоминается в нескольких ошибках NDK:

По сути, Clang генерировал вызовы, которые libgcc не реализует.Я говорю, что было , а не - , потому что это больше не относится к NDK r17 для этой конкретной функции.

В случае, если вы 'Это все еще происходит, и я просто не смог ни с одним из более ранних тестовых случаев, вы можете попробовать связать с -lcompiler_rt-extras.Это включено с NDK r17 и имеет отсутствующие функции.

...