我正在尝试使用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)