Компиляция 64-битных архитектур Speex и SpeexDSP для Android приводит к «ошибке: невозможное ограничение в« asm »» - PullRequest
0 голосов
/ 07 февраля 2019

Google недавно объявил о политике, согласно которой библиотеки поддержки должны быть перекомпилированы для поддержки 64-битной версии, поэтому я надеюсь, что кто-то еще недавно тоже шел по этому пути.

Я пытаюсь скомпилировать Speex 1.2 для Android 64-битной ARM.Я смог построить speex, но speexdsp не удалось.

Вот шаги, которые я предпринял, после чего произошел сбой:

  1. Создан отдельный набор инструментов:

    ~/android-ndk-r17/build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=~/speex-toolchain --arch=arm64
    
  2. Установите мой PATH для первого поиска в каталоге bin набора инструментов

    export PATH=~/speex-toolchain/bin:$PATH
    
  3. Установите переменные CC и RANLIB env (может быть, нет необходимости?)

    export CC=aarch64-linux-android-gcc
    export RANLIB=aarch64-linux-android-ranlib
    
  4. ./configure --host=arm
  5. make

Сбой при выполнении:

make  all-recursive
make[1]: Entering directory `/Users/spartygw/Downloads/speexdsp-1.2rc3'
Making all in libspeexdsp
make[2]: Entering directory `/Users/spartygw/Downloads/speexdsp-1.2rc3/libspeexdsp'
  CC       preprocess.lo
  CC       jitter.lo
  CC       mdf.lo
  CC       fftwrap.lo
  CC       filterbank.lo
  CC       resample.lo
In file included from resample.c:104:0:
resample.c: In function 'resampler_basic_direct_single':
resample_neon.h:148:5: error: impossible constraint in 'asm'
     asm volatile ("  cmp %[len], #0\n"
     ^
make[2]: *** [resample.lo] Error 1
make[2]: Leaving directory `/Users/spartygw/Downloads/speexdsp-1.2rc3/libspeexdsp'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/Users/spartygw/Downloads/speexdsp-1.2rc3'
make: *** [all] Error 2

1 Ответ

0 голосов
/ 08 февраля 2019

Вместо шагов 3 и 4, я бы предложил просто сделать ./configure --host=aarch64-linux-android, который позаботится о подборе правильных инструментов и который правильно выберет целевую архитектуру.

Что касается основной проблемы, тоОшибка компиляции, кажется, проблема в том, что speexdsp поддерживает NEON (набор инструкций SIMD ARM), но обнаруживает его в конфигурации одним способом (проверяя, работает ли #include <arm_neon.h> и работают ли встроенные функции компилятора NEON, которые работают одинаково для обоихARM и AArch64).Как только он пришел к выводу, что NEON поддерживается, он продолжает использовать его через встроенную сборку (которая отличается для ARM и AArch64).

Таким образом, вывод заключается в том, что speexdsp поддерживает только NEON на ARM (32-разрядной), а нена 64-битной, но скрипт конфигурации speexdsp также некорректно включает его для AArch64.Добавьте --disable-neon к вызову configure, и компиляция должна завершиться успешно.

...