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 失败了。
以下是我执行的步骤,然后失败了:
创建了一个独立的工具链:
~/android-ndk-r17/build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=~/speex-toolchain --arch=arm64
将我的 PATH
设置为首先在工具链的 bin 目录中查找
export PATH=~/speex-toolchain/bin:$PATH
设置 CC
和 RANLIB
环境变量(也许没有必要?)
export CC=aarch64-linux-android-gcc
export RANLIB=aarch64-linux-android-ranlib
./configure --host=arm
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
添加到配置调用中,编译应该会成功。
Google 最近宣布了要求重新编译支持库以支持 64 位的政策,所以我希望其他人最近也走上了这条路。
我正在尝试为 Android 64 位 ARM 编译 Speex 1.2。我能够构建 speex,但 speexdsp 失败了。
以下是我执行的步骤,然后失败了:
创建了一个独立的工具链:
~/android-ndk-r17/build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=~/speex-toolchain --arch=arm64
将我的
PATH
设置为首先在工具链的 bin 目录中查找export PATH=~/speex-toolchain/bin:$PATH
设置
CC
和RANLIB
环境变量(也许没有必要?)export CC=aarch64-linux-android-gcc export RANLIB=aarch64-linux-android-ranlib
./configure --host=arm
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
添加到配置调用中,编译应该会成功。