如何在CMake文件中正确配置随PETSc安装的FFTW依赖?
解决通过PETSc安装的FFTW链接错误问题
关键逻辑
你通过PETSc --download-fftw 安装的FFTW是和PETSc绑定编译的,它的路径、编译参数都由PETSc配置系统管理,直接用独立FFTW的pkgconfig会找不到正确的库文件或参数,必须通过PETSc自带的CMake接口来引入FFTW。
具体CMake配置步骤
让CMake定位到PETSc
在你的CMakeLists.txt开头加入:find_package(PETSc REQUIRED)因为PETSc安装在
/usr/local/petsc,运行CMake时要手动指定PETSc的路径和架构目录(架构目录是PETSc编译时生成的子目录,比如arch-linux-c-opt,可去/usr/local/petsc下查找):cmake .. -DPETSC_DIR=/usr/local/petsc -DPETSC_ARCH=你的PETSc架构目录名引入FFTW的编译依赖
PETSc会自动记录FFTW的头文件和库路径,直接在CMakeLists.txt里添加:# 检查PETSc是否确实集成了FFTW if(NOT PETSC_HAVE_FFTW) message(FATAL_ERROR "PETSc未成功安装FFTW,请重新编译PETSc并指定--download-fftw") endif() # 添加FFTW头文件路径 include_directories(${PETSC_FFTW_INCLUDES}) # 链接FFTW及PETSc依赖库(注意顺序,PETSc库要放在前面) target_link_libraries(你的程序目标名 PRIVATE ${PETSC_LIBRARIES} ${PETSC_FFTW_LIBRARIES})代码层面的匹配检查
确保代码里包含正确的FFTW MPI头文件:#include <fftw3-mpi.h>要是PETSc编译的是单精度FFTW,头文件要换成
fftw3f-mpi.h,对应的初始化函数是fftwf_mpi_init,别搞混精度版本。
排查要点
- 去
/usr/local/petsc/你的架构目录/lib下确认有没有libfftw3_mpi.a或libfftw3_mpi.so,没有的话说明PETSc下载编译FFTW时出错了,得重新执行PETSc的配置编译流程。 - 运行CMake时查看输出日志,确认
PETSC_HAVE_FFTW显示为YES,且PETSC_FFTW_LIBRARIES正确指向了FFTW的库文件。 - 如果还有其他未定义引用,检查MPI库是否被正确链接——
fftw_mpi_init依赖MPI,PETSc一般已经处理了MPI依赖,但如果你的项目单独使用MPI,要确保MPI库也被加入链接。
内容的提问来源于stack exchange,提问作者Yes
相关产品推荐
相关产品推荐

