如果存在调用 fseek,gfortran -std=f2008 编译标志错误
gfortran -std=f2008 compile flag errors if call fseek present
我正在尝试使用 gfortran 强制执行 Fortran 2008 一致性检查。当我使用 -std=f2008 编译时,出现以下错误:
Undefined symbols for architecture x86_64:
"_fseek_", referenced from:
_MAIN__ in ccJtOcKa.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
下面的简单测试程序显示了这个问题。它在没有 -std=f2008 的情况下编译并运行良好,但在设置此标志时不编译。
program main
implicit none
integer :: i
open(unit=10, file='test.bin', access='stream')
write(10) 100
!fseek works, but will not compile with -std=f2008
call fseek(10, -4, 1)
read(10) i
print *, i
end program
这个有效:
gfortran main.f90
这给出了错误:
gfortran -std=f2008 main.f90
我使用的是 MacPorts 版本的 gfortran 8.2
GNU Fortran (MacPorts gcc8 8.2.0_3) 8.2.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
fseek 不是 Fortran 2008 标准的一部分吗?如果是这样,是否有其他方法可以做到这一点?
FSEEK
一个扩展内在子程序,它对于流访问是不必要的。您可以从任意位置阅读
read(10, pos=42) i
您也可以通过inquire
语句获取当前位置。
inquire(unit=10, pos=current_pos)
正如其他人所指出的,FSEEK
不在 Fortran 标准中。但是,Fortran 标准确实允许处理器提供额外的内部函数子程序。为避免您遇到的问题,您可以使用 -fall-intrinsics
选项。因此,gfortran -std=f2008 -fall-intrinsics
将尝试遵守 Fortran 2008 标准,但 gfortran 提供的所有内部子程序都可用。
我正在尝试使用 gfortran 强制执行 Fortran 2008 一致性检查。当我使用 -std=f2008 编译时,出现以下错误:
Undefined symbols for architecture x86_64:
"_fseek_", referenced from:
_MAIN__ in ccJtOcKa.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
下面的简单测试程序显示了这个问题。它在没有 -std=f2008 的情况下编译并运行良好,但在设置此标志时不编译。
program main
implicit none
integer :: i
open(unit=10, file='test.bin', access='stream')
write(10) 100
!fseek works, but will not compile with -std=f2008
call fseek(10, -4, 1)
read(10) i
print *, i
end program
这个有效:
gfortran main.f90
这给出了错误:
gfortran -std=f2008 main.f90
我使用的是 MacPorts 版本的 gfortran 8.2
GNU Fortran (MacPorts gcc8 8.2.0_3) 8.2.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
fseek 不是 Fortran 2008 标准的一部分吗?如果是这样,是否有其他方法可以做到这一点?
FSEEK
一个扩展内在子程序,它对于流访问是不必要的。您可以从任意位置阅读
read(10, pos=42) i
您也可以通过inquire
语句获取当前位置。
inquire(unit=10, pos=current_pos)
正如其他人所指出的,FSEEK
不在 Fortran 标准中。但是,Fortran 标准确实允许处理器提供额外的内部函数子程序。为避免您遇到的问题,您可以使用 -fall-intrinsics
选项。因此,gfortran -std=f2008 -fall-intrinsics
将尝试遵守 Fortran 2008 标准,但 gfortran 提供的所有内部子程序都可用。