摘要

通过使用Intel FFTW3 wrapper, 解决了自编FFTW下编译WIEN2k v14.2时出现的多次定义”fftw_destroy_plan”错误

问题描述

尝试用Intel 2018.0和对应编译的FFTW3库编译WIEN2k v14.2. 用siteconfig_lapw, 在编译SRC_lapw0中的并行程序lapw0_mpi时, 报错

1
2
3
4
libfftw3.a (apiplan.o): In function `fftw_destroy_plan’:
apiplan.c:(.text+0x430): multiple definition of `fftw_destroy_plan’
mkl/lib/intel64/libmkl_intel_lp64.a(fftw_destroy_panl.o):fftw_destroy_plan.c(.text+0x0): first defined here
make[1]: *** [Makefile:99: lapw0_mpi] Error 1

最终编译信息里提示tetra, joint, telnes3报错, 错误为Internal compiler error.

解决过程

因为是FFTW3和MKL的冲突, 所以考虑放弃自己编译的FFTW3, 用Intel自带的FFTW3 wrapper. 在编译好静态库libfftw3xf_intel.a后, 把include改为mkl/interfaces/fftw, 把-lfftw3改为该静态库的绝对路径, 删掉lfftw3_mpi

作上述修改后用siteconfig_lapw重新编译lapw0, 出现fft_modules报错, 提示未定义MPI FFTW3变量的引用. 参考Intel的官方文档, 发现对MPI FFTW3有关变量的包装器定义在fftw3x_cdtf中, 需要编译这个lib. 链接时用它取代原来lfftw3_mpi的位置.

改完后再重新编译, 这一次报错libfftw3x_cdft链接错误: Undefined reference to DftiSetValueDM. 参考该 Intel forum链接 , 在静态链接时把libmkl_cdft_core.a放入链接的group中. 编译通过! 这时把RP_LIBS中的libfftw3xf.a去掉, 也可以正常编译.

Comments