Linux环境FFTW源码编译 | recompile with -fPIC报错解决

本文详细介绍了在Linux及WindowsSubsystemforLinux(WSL)环境下编译FFTW库的步骤,包括动态库和静态库的编译,以及遇到recompilewith-fPIC错误时的解决方法。

一、Linux中编译FFTW

1、下载FFTW源码,在源码目录创建一个build目录

2、进入build目录,使用cmake编译即可

编译动态库:

cmake ..

make

编译静态库:

cmake .. -DBUILD_SHARED_LIBS=OFF

make

如果需要单精度版本,入参ENABLE_FLOAT设置为ON:

cmake .. -DENABLE_FLOAT=ON

二、WSL环境编译

在windows的WSL环境中编译,和上面的方法是一样的。

三、recompile with -fPIC报错解决

静态库在引用的时候可能会报错

报错信息

libfftw3.a(assert.c.o): relocation R_X86_64_PC32 against symbol `stdout@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value

解决方法是修改CMakeList.txt,在312行增加下面的内容,重新编译即可解决报错。

add_library (${fftw3_lib} ${SOURCEFILES})
# 增加下面这一行
set_target_properties(${fftw3_lib} PROPERTIES POSITION_INDEPENDENT_CODE ON)

在WSL中编译的libfftw3.a大小为9.9M,服务器上编译的libfftw3.a只有2.1M。

<think>好的,我现在需要帮助用户编译FFTW源码生成静态库。首先,我得回想一下用户提供的引用内容,里面提到了几个关键点。用户之前的问题是关于生成静态库,而引用中多次提到了使用--enable-static和--disable-shared选项,比如引用[1]中的配置命令就是这样的。另外,引用[3]和[4]也提到了静态库的编译和链接问题,可能需要注意编译器选项。接下来,我应该整理一下步骤。首先,用户需要下载源码并解压,这是常规操作。然后进入目录,运行bootstrap.sh,这个在引用[4]里有提到,用户可能需要执行这个脚本来准备编译环境。接着是配置步骤,这里的关键是正确设置configure的参数。根据引用[1]和[5],需要指定--enable-static和--disable-shared来生成静态库。同时,用户可能需要指定安装路径,比如--prefix,这样编译后的库文件会放在指定位置,方便后续使用。 然后,make和makeinstall是标准流程,但需要注意权限问题,比如引用[4]中提到使用sudo时可能找不到编译器,这时候需要调整环境变量或者修改sudo的配置。此外,用户可能需要指定交叉编译工具链,比如在ARM平台上,引用[5]提到可以使用--enable-neon,但注意AARCH64不适用,所以需要根据目标平台选择合适的参数。还有数据类型的问题,FFTW支持不同精度,用户如果需要单精度的话,要加上--enable-float,这在引用[2]和[5]都有说明。生成后的库文件会有不同的前缀,比如fftw3f对应单精度,所以用户需要根据需求选择。最后,验证部分,用户需要检查生成的.a文件是否存在,并编写测试程序链接静态库,确保没有未定义引用错误,如引用[3]中的问题,可能需要在编译时显式链接数学库-lm。可能遇到的问题包括权限问题、编译器路径问题,以及静态库链接时的顺序问题。需要提醒用户注意这些点,确保每一步都正确执行。同时,引用中提到的各种配置选项,比如--host、交叉编译器的设置,如果用户是在交叉编译环境下,可能需要更详细的指导,但用户当前的问题可能集中在静态库的生成,所以先提供基本步骤,再根据具体情况调整。</think>根据引用内容,编译FFTW静态库的关键步骤如下: ### 一、编译步骤 1. **下载解压源码** ```bash wget http://www.fftw.org/fftw-3.3.10.tar.gz tar -zxvf fftw-3.3.10.tar.gz cd fftw-3.3.10 ``` 2. **配置编译参数** ```bash ./configure \ --prefix=/your/install/path \ --enable-static=yes \ --disable-shared \ CC=your_c_compiler \ CXX=your_c++_compiler ``` - `--enable-static=yes`:强制生成静态库[^1][^3] - `--disable-shared`:禁用动态库生成[^1] - `CC/CXX`:指定交叉编译器(如ARM平台需用`aarch64-linux-gnu-gcc`)[^4] 3. **编译安装** ```bash make -j4 sudo make install ``` 若遇到权限问题,需在`sudo`环境中添加编译器路径到`secure_path`[^4] ### 二、关键参数说明 | 参数 | 作用 | |---------------------|----------------------------------------------------------------------| | `--enable-float` | 生成单精度版本库(默认双精度)[^2][^5] | | `--enable-long-double` | 支持长双精度类型[^5] | | `--host=arm-linux` | 指定交叉编译目标平台[^4] | | `LIBS="-lm"` | 显式链接数学库(解决未定义符号问题)[^3][^4] | ### 三、验证生成结果 安装目录中将包含: ``` include/fftw3.h lib/libfftw3.a # 双精度静态库 lib/libfftw3f.a # 单精度静态库(需加--enable-float) ``` ### 四、测试程序编译 ```bash gcc test.c -I/your/install/path/include -L/your/install/path/lib -lfftw3 -lm ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值