为什么集群上的 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
这也是符合逻辑的;您应该在指定从这些路径加载哪些库之前指定路径。
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.
我正在尝试在集群上使用 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
这也是符合逻辑的;您应该在指定从这些路径加载哪些库之前指定路径。
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.