为什么 GCC 没有在集群上加载 FFTW 库?

问题描述

我正在尝试使用 FFTW 3.3.5 在集群上执行一个简单的 FFT。

fftwf_plan plan = fftwf_plan_dft_1d(N,idata,odata,FFTW_FORWARD,FFTW_ESTIMATE);
//--------------------Perform FFT--------------------------
fftwf_execute(plan);

//-------------------Inverse FFT--------------------------
plan = fftwf_plan_dft_1d(N,FFTW_BACKWARD,FFTW_ESTIMATE);
fftwf_execute(plan);
fftwf_destroy_plan(plan);

我已经尝试使用以下命令来执行上面的代码

gcc -o fftw.out /cm/extra/apps/FFTW/3.3.5/GCC-4.9.3_MVAPICH2-2.2-GDR/lib/libfftw3.a -lm fftwcpu.c

gcc -o fftw.out -lfftw3 -lm fftwcpu.c -L/cm/extra/apps/FFTW/3.3.5/GCC-4.9.3_MVAPICH2-2.2-GDR/lib/

路径也在 LD_LIBRARY_PATH 环境变量中加载。

GCC 能够正确找到路径,但它没有链接库。我收到 fftw 的所有函数的未定义引用错误

在上面的代码中,我也使用了 fftw_ 函数而不是 fftwf_ 函数

更重要的是,这段代码在我的本地系统上运行没有任何问题。

我做错了什么吗?

解决方法

您的选项顺序不正确:将 -l 选项放在最后,如下所示:

$ gcc -o fftw.out fftwCPU.c -L/cm/extra/apps/FFTW/3.3.5/GCC-4.9.3_MVAPICH2-2.2-GDR/lib/ -lfftw3 -lm

这也是合乎逻辑的;您应该在指定从这些路径加载哪些库之前指定路径。

来自the fine manual

在命令中编写此选项的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,‘foo.o -lz bar.o’在文件 foo.o 之后但在 bar.o 之前搜索库‘z’。如果 bar.o 引用了 ‘z’ 中的函数,则这些函数可能不会被加载。