为什么集群上的 GCC 不加载 FFTW 库?

Why FFTW libraries are not loaded by GCC on the cluster?

我正在尝试在集群上使用 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, odata, odata, 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

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, ‘foo.o -lz bar.o’ searches library ‘z’ after file foo.o but before bar.o. If bar.o refers to functions in ‘z’, those functions may not be loaded.