X86下fftw3库的编译和链接
因为缺少ARM板卡,这几天进行了将NENO代码移植到X86的工作,没想到,在FFT这里也卡了半天的时间。比较意外,这里稍作整理
因为现在有了kimi和chatgpt,一些与编译器交互的工作轻松了不少,但还是少不了遇到困难的时候,在处理fftw3的时候,遇到
undefined reference to `fftwf_malloc'
的问题。
 这里我从头到尾详细描述一下过程。
写在前面:
在ARM的toolchain中,fftw3,是其组成部分,所以不需要单独进行编译过安装。
 在ununtu下,可以利用apt-get直接安装fftw3或fftw3-dev,但因为我的开发机,不能联网,我也担心出问题,所以,自己编译。
下载
在这个页面:https://github.com/FFTW/fftw3/releases
 人家明确说,不要在这里下,去主站下,So, 到这里:
 https://fftw.org/
 转到download page:
 https://fftw.org/download.html
 然后我选了这个:
 https://fftw.org/fftw-3.3.10.tar.gz
tar -xzvf fftw-3.3.10.tar.gz
cd fftw-3.3.10
编译
./configure --enable-float
make clean
make
sudo make install
上面,要注意这里 : ./configure --enable-float
 关键的要点是 ./configure --enable-float
 如查不加上这个参数,就无法得到 libfftw3f.a
root@edit:/usr/local/lib/cmake/fftw3# ls -l /usr/local/lib/libfft*
-rw-r--r-- 1 root root 2262984 Oct 31 11:32 /usr/local/lib/libfftw3.a
-rw-r--r-- 1 root root 2262984 Oct 30 17:54 /usr/local/lib/libfftw3.a.ori
-rw-r--r-- 1 root root 2252630 Oct 31 11:34 /usr/local/lib/libfftw3f.a
-rwxr-xr-x 1 root root     891 Oct 31 11:34 /usr/local/lib/libfftw3f.la
-rwxr-xr-x 1 root root     888 Oct 31 11:32 /usr/local/lib/libfftw3.la
-rw-r--r-- 1 root root   48348 Oct 31 11:32 /usr/local/lib/libfftw3_threads.a
-rwxr-xr-x 1 root root     948 Oct 31 11:32 /usr/local/lib/libfftw3_threads.la
如果不能编译出 libfftw3f.a,而只有 libfftw3.a
 而程序中使用的是float计算,那么,就遇到麻烦了。
 我就掉到这个坑里,因为之前正处理NEON一脑门的issues,完全没有意识到后面多个了f。
 所以,背动了好一会。
如何发现和解决这个问题(这部分也有用):
- 第一步看到 undefined reference时,当然知道有lib没有链上。
 然后手写fftw3在CMakeList.txt中,像这样:
target_link_libraries(myproject    fftw3
)
- 然后了解到,这样显得不太专业,正常应当这样:
find_package(FFTW3 REQUIRED)
。。。
include_directories(${FFTW3_INCLUDE_DIR})
。。。
target_link_libraries(myproject    ${FFTW3_LIBRARIES}dft
)
- 但是一点作用也没有。
 然后,在CMakeList.txt中加入:
message(STATUS "FFTW3_LIBRARIES: ${FFTW3_LIBRARIES}")
打印出来,与我手工写的fftw3是一样的。
- 在到门外转了一会,清醒了不少。
- 想到用nm工具看看,是不是真的没有这个函数的symbol
 /usr/local/lib/libfftw3.a | grep fftwf_malloc
 显然输出是空,因为人家期待的是另一个库:
 /usr/local/lib/libfftw3f.a
- 到这我可以肯定是编译的时候,参数设置不对了。
- 然后得到这句:./configure --enable-float
- link PASS
- 正确的CMakeList.txt的部分:
find_package(FFTW3 REQUIRED)
。。。
include_directories(${FFTW3_INCLUDE_DIR})
。。。
target_link_libraries(myproject    ${FFTW3_LIBRARIES}fdft
)
注意后面添加了f
 ls /usr/local/lib/libfftw3f.a
 nm /usr/local/lib/libfftw3f.a | grep fftwf_malloc
 这次输出了相关的符号。
小结
要点:./configure --enable-float