Compiling Speex and SpeexDSP for Android 64bit architectures results in "error: impossible constraint in 'asm'"

Compiling Speex and SpeexDSP for Android 64bit architectures results in "error: impossible constraint in 'asm'"

Google 最近宣布了要求重新编译支持库以支持 64 位的政策,所以我希望其他人最近也走上了这条路。

我正在尝试为 Android 64 位 ARM 编译 Speex 1.2。我能够构建 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. 设置 CCRANLIB 环境变量(也许没有必要?)

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

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

我建议只执行 ./configure --host=aarch64-linux-android 而不是第 3 步和第 4 步,这会负责选择正确的工具,并使目标架构正确。

至于主要问题,编译错误,问题似乎是 speexdsp 确实支持 NEON(ARM 的 SIMD 指令集),但它以一种方式在配置中检测到它(通过测试 #include <arm_neon.h>工作,如果 NEON 编译器内在函数工作,它对 ARM 和 AArch64 工作相同)。一旦得出支持 NEON 的结论,它将继续通过内联汇编使用它(这对于 ARM 和 AArch64 是不同的)。

因此结论是 speexdsp 仅支持 ARM(32 位)上的 NEON,而不支持 64 位,但 speexdsp 的配置脚本也错误地为 AArch64 启用了它。将 --disable-neon 添加到配置调用中,编译应该会成功。