【交叉编译】编译生成 x86、arm 环境下的FFTW库

文章详细介绍了如何在x86环境下编译FFTW库的double、float和longdouble三种数据类型的版本,并提到ARM环境下的编译过程类似,需要指定编译环境和编译器。编译选项包括--enable-float和--enable-long-double来选择不同精度的版本。

FFTW是一个快速计算离散傅里叶变换的标准C语言程序集,可计算一维或多维实和复数据以及任意规模的DFT。下面主要介绍的是 x86 环境下 FFTW库的编译过程,arm环境下的编译过程和FFTW类似,不同之处在于需要手动指定 编译环境编译器

FFTW有三个版本的数据类型:double、float和long double,在安装时对应不同的编译选项,最终得到的库也不尽相同。(以安装fftw 3.3版本为例)

类型 库名称 编译选项
double 类型 fftw3-3 默认安装,无需另加编译选项
float 类型 fftw3f-3 --enable-float
long double类型 fftw3l-3 --enable-long-double

参考文章:


目录

一、下载 fftw 编译包

二、x86 环境

1、安装 fftw3(默认安装)

2、安装 fftw3f

3、安装 fftw3l

三、ARM 环境


一、下载 fftw 编译包

下载地址:download | fftw

复制链接地址,然后在Linux命令使用 wget 命令下载,或者也可以先在本地下载,然后再上传到Linux平台。 

wget https://www.fftw.org/fftw-3.3.10.tar.gz

后续内容可以根据自身需要选择安装对应的环境。

二、x86 环境

解压刚才下载的包,然后进入到fftw的编译目录

tar -zxvf fftw-3.3.10.tar.gz 
cd fftw-3.3.10/

FFTW有三个版本的数据类型:double、float和long double,在安装时对应不同的编译选项,最终得到的库也不尽相同。下面三个安装过程是各自独立的,不可一次使用所有选项

类型 库名称 编译选项
double 类型 fftw3-3 默认安装,无需另加编译选项
float 类型 fftw3f-3 --enable-float
long double类型 fftw3l-3
### 编译环境准备 在 Android NDK 环境下为 ARM-v8a 架构编译 FFTW3 ,需要确保系统中已安装 Android NDK,并配置好相关环境变量。此外,还需要下载 FFTW3 的源码包,并确保系统中安装了必要的构建工具,如 `autoconf`、`automake` 和 `libtool` 等 [^1]。 ### 配置交叉编译环境 进入 FFTW3 源码目录,运行 `configure` 脚本进行交叉编译配置。配置命令需指定目标平台、编译器以及启用静态等选项。例如,为 ARM-v8a 架构进行配置时,可以使用如下命令: ```bash sh configure \ --build=x86_64-pc-linux-gnu \ --host=aarch64-linux-android \ --enable-static \ --disable-shared \ CC=aarch64-linux-android-clang \ CXX=aarch64-linux-android-clang++ \ AR=aarch64-linux-android-ar \ RANLIB=aarch64-linux-android-ranlib ``` 该配置适用于 ARM64-v8a 架构,使用 Android NDK 提供的 Clang 编译器链进行构建 [^3]。 ### 构建与安装 运行以下命令完成编译和安装: ```bash make -j4 make install ``` 编译完成后,静态文件(`.a` 文件)将被安装到指定的 `prefix` 目录下的 `lib` 子目录中,头文件将被安装到 `include` 子目录中。 ### 在 Android NDK 项目中使用 FFTW3 1. 将编译好的静态文件和头文件复制到 Android NDK 项目的 `jniLibs` 或 `include` 目录下。 2. 在 `Android.mk` 或 `CMakeLists.txt` 文件中配置路径和头文件路径。例如,在 `Android.mk` 中添加: ```makefile include $(CLEAR_VARS) LOCAL_MODULE := fftw3 LOCAL_SRC_FILES := path_to_fftw_sources/lib/libfftw3.a LOCAL_EXPORT_C_INCLUDES := path_to_fftw_sources/include include $(PREBUILT_STATIC_LIBRARY) ``` 3. 在应用程序模块中链接 FFTW3 静态: ```makefile LOCAL_STATIC_LIBRARIES += fftw3 ``` 4. 在 C/C++ 代码中包含头文件并调用 FFTW3 函数: ```cpp #include <fftw3.h> extern "C" JNIEXPORT void JNICALL Java_com_example_myapp_FFTWrapper_executeFFT(JNIEnv *env, jobject /* this */) { int N = 1024; fftw_complex *in, *out; fftw_plan p; in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(p); // 执行 FFT fftw_destroy_plan(p); fftw_free(in); fftw_free(out); } ``` ### 注意事项 - 为 ARM64-v8a 架构编译时,需确保使用的 NDK 版本支持该架构,并且编译器链正确配置 [^2]。 - 如果目标设备支持 NEON 指令集,可以尝试启用相关优化以提升性能。 - 建议将 FFTW3 的构建配置拆分为单独的 `.mk` 文件,以提高可维护性 [^4]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值