gfortran for dummies: Was macht mcmodel = medium genau?
Ich habe einen Code, der mir beim Kompilieren Versetzungsfehler verursacht. Im Folgenden finden Sie ein Beispiel, das das Problem veranschaulicht:
program main
common/baz/a,b,c
real a,b,c
b = 0.0
call foo()
print*, b
end
subroutine foo()
common/baz/a,b,c
real a,b,c
integer, parameter :: nx = 450
integer, parameter :: ny = 144
integer, parameter :: nz = 144
integer, parameter :: nf = 23*3
real :: bar(nf,nx*ny*nz)
!real, allocatable,dimension(:,:) :: bar
!allocate(bar(nf,nx*ny*nz))
bar = 1.0
b = bar(12,32*138*42)
return
end
Kompilieren Sie dies mitgfortran -O3 -g -o test test.f
Ich erhalte den folgenden Fehler:
relocation truncated to fit: R_X86_64_PC32 against symbol `baz_' defined in COMMON section in /tmp/ccIkj6tt.o
Aber es funktioniert wenn ich benutzegfortran -O3 -mcmodel=medium -g -o test test.f
. Beachten Sie auch, dass es funktioniert, wenn ich das Array zuweisbar mache und es innerhalb der Subroutine zuordne.
Meine Frage ist was genau macht-mcmodel=medium
tun? Ich hatte den Eindruck, dass die beiden Versionen des Codes (die mitallocatable
Arrays und das ohne waren mehr oder weniger gleichwertig ...