在为Android交叉编译FFTW时如何启用硬浮点
我正在尝试为Android编译一个运行在ARM设备上的第三方库()。该库包括一个我想在我的设备上运行的基准测试工具。按照Google关于如何使用NDK r9d配置硬浮点的说明(),我使用以下标志:在为Android交叉编译FFTW时如何启用硬浮点,android,android-ndk,cross-compiling,Android,Android Ndk,Cross Compiling,我正在尝试为Android编译一个运行在ARM设备上的第三方库()。该库包括一个我想在我的设备上运行的基准测试工具。按照Google关于如何使用NDK r9d配置硬浮点的说明(),我使用以下标志: NDK_ROOT="/opt/android/ndk" TOOLCHAIN="$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/" export SYS_ROOT="$NDK_ROOT/platforms
NDK_ROOT="/opt/android/ndk"
TOOLCHAIN="$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/"
export SYS_ROOT="$NDK_ROOT/platforms/android-18/arch-arm"
export CC="$TOOLCHAIN/arm-linux-androideabi-gcc --sysroot=$SYS_ROOT"
export LD="$TOOLCHAIN/arm-linux-androideabi-ld"
export AR="$TOOLCHAIN/arm-linux-androideabi-ar"
export NM="$TOOLCHAIN/arm-linux-androideabi-nm"
export RANLIB="$TOOLCHAIN/arm-linux-androideabi-ranlib"
export STRIP="$TOOLCHAIN/arm-linux-androideabi-strip"
export CFLAGS="-mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1"
export LDFLAGS="-Wl,-lm_hard -Wl,--no-warn-mismatch"
./configure \
--host=arm-linux-androideabi \
--disable-fortran \
--disable-shared \
--enable-static \
--enable-threads \
--with-combined-threads \
--enable-single \
--prefix=$INSTALL_DIR
在这种配置下,基准测试的性能非常差。在我看来,这个库似乎是用softfloat编译的,或者是链接了softfloat libm
如何将库配置为使用硬浮点?我是否错过了一个重要的步骤
我知道我的设备上的FPU可以工作,因为我有第二台运行ArchLinux的设备,在该设备上库和基准测试的性能与预期一致,即比Android快600%。我能够解决这个问题。缺了三分
CFLAGS="-O2 -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1"
--with-slow-timer
为了链接libm_hard.a中数学函数的硬浮点版本,您需要将
-lm_hard
放在所有对象文件之后,但放在-lm
之前,后者是Android的libc.so,以软浮点编译LDFLAGS=“-Wl,-lm_hard”
在FFTW中不起作用,因为它放在所有对象文件之前LIBS=“-lm_-hard”
可以工作,但是在末尾配置集合LIBS=“-lm$LIBS”
,这将-lm
放在-lm_-hard
前面。您可以删除configure to workaround中的这一行,不过更好的修复方法是允许自定义系统数学库,或者在ltmain.sh中过滤掉-lm
,如果-lm\u hard
存在于$host arm-*linux android
是的,我想出来了,正如您所说,正在编辑configure