我正在尝试使用一个 fortran 库来执行名为“2Decomp&FFT”(http://www.2decomp.org/download.html)的 FFT。这个库有一个内置的 FFT 引擎,可以很好地与我的代码配合使用。为了在这个库中使用 FFTW3 引擎,而不是它的内置引擎,说明说:
在 2DECOMP 中编辑“src/Makefile.inc”文件,将 FFT 引擎更改为“FFT=fftw3”。您还需要在同一文件中设置 FFTW_PATH 变量以指向您的 FFTW 安装。然后重新编译一切。
我在本地 Mac 上安装了 FFTW3.3 并按照说明重新编译了库。但是,在那之后,当我尝试使用库编译代码时,链接时出现以下错误。
Undefined symbols for architecture x86_64:
"_dfftw_destroy_plan_", referenced from:
___decomp_2d_fft_MOD_decomp_2d_fft_finalize in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_execute_dft_", referenced from:
___decomp_2d_fft_MOD_c2c_1m_z in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_c2c_1m_x in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_c2c_1m_y in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_execute_dft_c2r_", referenced from:
___decomp_2d_fft_MOD_c2r_1m_x in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_fft_3d_c2r in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_execute_dft_r2c_", referenced from:
___decomp_2d_fft_MOD_fft_3d_r2c in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_plan_many_dft_", referenced from:
___decomp_2d_fft_MOD_c2c_1m_z_plan in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_c2c_1m_x_plan in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_c2c_1m_y_plan in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_plan_many_dft_c2r_", referenced from:
___decomp_2d_fft_MOD_init_fft_engine in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_plan_many_dft_r2c_", referenced from:
___decomp_2d_fft_MOD_init_fft_engine in lib2decomp_fft.a(fft_fftw3.o)
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [Sora_v71] Error 1
这是我编写的调用此库的最小代码:程序测试
use decomp_2d
use decomp_2d_fft
integer n, pr, pc
call decomp_2d_init(n,n,n,pr,pc)
call decomp_2d_fft_init
stop
end
这是我正在使用的 Makefile(DECOMP2D 是设置为包含库的文件夹的环境变量):
## ------------------------------------------------------------------------
# Lines included for using the 2decomp libraries
INC_2DECOMP = -I$(DECOMP2D)/include/
LIB_2DECOMP = -L$(DECOMP2D)/lib/ -l2decomp_fft
## ------------------------------------------------------------------------
RM = rm
SRCDIR = .
LIBDIR = .
BIN = a.out
OBJS = main.o
## ------------------------------------------------------------------------
# default command for compiler, linker
FC = mpif90
FFLAGS = $(F90FLAG) $(INC_2DECOMP)
LFLAGS = $(F90FLAG) $(LIB_2DECOMP) -L$(LIBDIR)
## ------------------------------------------------------------------------
# default action
all: $(BIN)
$(BIN): $(OBJS)
@echo Linking $(BIN) .....
$(FC) $(OBJS) $(LFLAGS) $(FFLAGS) -o $@
.f.o:
@echo Compiling $*.f
$(FC) $(LFLAGS) $(FFLAGS) -c $(SRCDIR)/$*.f
clean:
@echo 'Cleaning .....'
$(RM) -f core *.o *~ *.L *.O $(BIN) $(SIZE_FILE)