问题描述
我正在尝试使用 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
这也是合乎逻辑的;您应该在指定从这些路径加载哪些库之前指定路径。
在命令中编写此选项的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,‘foo.o -lz bar.o’在文件 foo.o 之后但在 bar.o 之前搜索库‘z’。如果 bar.o 引用了 ‘z’ 中的函数,则这些函数可能不会被加载。