X86下fftw3库的编译和链接undefined reference to fftwf_malloc
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