0

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

0 回答 0