使用gfortran链接FFTW3库时遭遇未定义引用错误
解决Fortran链接FFTW3的未定义引用及main错误问题
1. 先修复undefined reference to main错误
你提到Fortran源文件是ksbenchmrk.f90,但编译命令用的是ksbenchmark.f90——文件名拼写不一致,gfortran找不到包含main程序的源文件,自然报这个错。
解决方法:
确保编译命令里的文件名和实际源文件名完全一致,比如:
gfortran ksbenchmrk.f90 -lfftw3 -lm
或者把源文件重命名为ksbenchmark.f90再编译。
2. 解决FFTW3符号未定义问题
Fortran和C的符号命名规则不同(名字修饰差异),直接调用FFTW的C函数会导致符号不匹配,这是核心问题。
两种可行方案:
方案一:使用FFTW的Fortran专用库(推荐)
重新编译安装FFTW3时启用Fortran支持,这样会生成适配Fortran的接口库:
# 进入FFTW源码目录,重新配置编译 ./configure --enable-fortran --prefix=/usr/local make sudo make install
安装完成后,链接时使用对应精度的Fortran库(双精度用-lfftw3,单精度用-lfftw3f,长双精度用-lfftw3l),编译命令改为:
gfortran ksbenchmrk.f90 -lfftw3 -lm
同时在Fortran代码开头添加FFTW的Fortran接口引用:
include 'fftw3.f03'
或者使用模块形式:
use fftw3
方案二:手动声明C接口(无需重新编译FFTW)
如果不想重新编译FFTW,需要在Fortran代码里显式声明FFTW函数的C绑定,让编译器生成正确的符号名。示例如下:
use, intrinsic :: iso_c_binding implicit none ! 定义FFTW plan的C兼容类型 type, bind(C) :: fftw_plan end type fftw_plan ! 声明需要用到的FFTW函数接口,指定C端的原始函数名 interface type(fftw_plan) function dfftw_plan_dft_1d(n, in, out, sign, flags) bind(C, name='dfftw_plan_dft_1d') import :: c_int, c_double, fftw_plan, c_ptr integer(c_int), value :: n, sign, flags type(c_ptr), value :: in, out end function dfftw_plan_dft_1d subroutine dfftw_execute(plan) bind(C, name='dfftw_execute') import :: fftw_plan type(fftw_plan), value :: plan end subroutine dfftw_execute ! 按需添加其他FFTW函数的接口声明,比如dfftw_destroy_plan等 end interface ! 你的主程序代码 program ksbenchmrk ! ... 程序逻辑 ... end program ksbenchmrk
然后用修正后的编译命令(确保文件名正确)即可正常链接。
3. 关于库路径的补充说明
g++能自动找到/usr/local/lib是因为该路径通常在系统默认的链接搜索路径中(可通过g++ -print-search-dirs查看)。如果gfortran的搜索路径不包含/usr/local/lib,可以在编译时添加-L/usr/local/lib,但这个问题在前面的核心错误解决后应该会自动消失。
内容的提问来源于stack exchange,提问作者user37292
相关产品推荐
相关产品推荐

