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
相关产品推荐
相关产品推荐

