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

MacOS下使用FFTW3 Fortran库编译报错求助

解决gfortran编译FFTW3 Fortran程序时__gfortran_os_error_at未定义的问题

问题背景

使用gfortran编译调用FFTW3的Fortran程序(pois.f90)时出现链接错误,提示__gfortran_os_error_at符号未找到,但Intel编译器ifort可正常编译。相关信息如下:

错误信息

Undefined symbols for architecture x86_64:
"_gfortran_os_error_at", referenced from:
MAIN
in ccAVlghr.o
ld: symbol(s) not found for architecture x86_64

编译命令

gfortran -I/usr/local/include -L/usr/local/lib pois.f90 -lfftw3 -lm

程序中调用FFTW3的子程序片段:

subroutine fft_forward(j,f,Fr,Fi)
  use, intrinsic :: iso_c_binding
  implicit none
  include 'fftw3.f03'
  double precision :: f(j),Fr(j),Fi(j)
  integer :: i,j
  type(C_PTR) :: plan
  complex(C_DOUBLE_COMPLEX) :: FF(j)

  plan = fftw_plan_dft_r2c_1d(j,f,FF,FFTW_ESTIMATE)
  call fftw_execute_dft_r2c(plan,f,FF)
  call fftw_destroy_plan(plan)

  do i = 1,j
    Fr(i) = real(FF(i))/j
    Fi(i) = aimag(FF(i))/j
  enddo

  Fr = Fr/j; Fi = Fi/j
end

解决建议

  • 重新编译FFTW3库,确保与gfortran兼容
    该错误核心原因是当前使用的FFTW3库由Intel编译器编译,与gfortran的Fortran运行时库ABI(应用二进制接口)不兼容。需用gfortran重新编译FFTW3:

    # 下载FFTW3源码后执行以下步骤
    ./configure CC=gcc FC=gfortran --enable-shared --enable-fortran
    make
    sudo make install
    
  • 调整编译命令的库顺序
    库的链接顺序会影响符号解析,将源文件放在编译参数最前面,再指定头文件、库路径和库:

    gfortran pois.f90 -I/usr/local/include -L/usr/local/lib -lfftw3 -lm
    
  • 检查编译环境版本一致性
    确保gfortran版本与编译FFTW3时使用的gcc/gfortran版本一致,避免因版本差异导致的ABI不兼容。运行gfortran --version查看当前版本,编译FFTW3时使用相同版本的编译器。

  • 修正程序中的变量名冲突
    子程序中形参j与局部变量j重名,会导致变量覆盖引发逻辑错误(虽不直接导致链接错误,但需修正):

    subroutine fft_forward(j,f,Fr,Fi)
      use, intrinsic :: iso_c_binding
      implicit none
      include 'fftw3.f03'
      double precision :: f(j),Fr(j),Fi(j)
      integer :: i, idx  ! 替换局部变量j为idx
      type(C_PTR) :: plan
      complex(C_DOUBLE_COMPLEX) :: FF(j)
    
      plan = fftw_plan_dft_r2c_1d(j,f,FF,FFTW_ESTIMATE)
      call fftw_execute_dft_r2c(plan,f,FF)
      call fftw_destroy_plan(plan)
    
      do idx = 1,j
        Fr(idx) = real(FF(idx))/j
        Fi(idx) = aimag(FF(idx))/j
      enddo
    
      Fr = Fr/j; Fi = Fi/j
    end
    

内容的提问来源于stack exchange,提问作者Madhurjya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:20:46