You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:05:21