DISLIN 库,"dislin.mod" 不是 Fortran 文件
DISLIN library, "dislin.mod" is not a Fortran file
好吧,我刚刚安装了 DISLIN,因为我必须将它与 Fortran 和 MPI 一起使用。
但是当我尝试 运行:
mpif90 -I/usr/local/dislin/ifc/ -L/usr/local/dislin -ldislin 3-life_parallelo.f90 -o life
但它总是回复我
USE DISLIN
1 Fatal Error: File 'dislin.mod' opened at (1) is not a GNU Fortran module file
我不知道该怎么办.. 在 /ifc 文件夹中我有 2 个文件:dislin.f90 和 dislin.mod,最后一个是 Audio Amiga SoundTracker (audio/x-mod) 文件类型.所以..我需要一个 dislin.mod fortran 文件..我必须像 "dislin.mod.f90" 一样保存它吗?我不这么认为。
更新(Dislin 库用 gfortran 重新编译,我重新运行 "mpif90 .." 见上文)
/tmp/ccm8YsO3.o: nella funzione "showgrid_":
3-life_parallelo.f90:(.text+0x39f): undefined reference to "getlev_"
3-life_parallelo.f90:(.text+0x3b9): undefined reference to "metafl_"
3-life_parallelo.f90:(.text+0x3f0): undefined reference to "page_"
3-life_parallelo.f90:(.text+0x3f5): undefined reference to "disini_"
3-life_parallelo.f90:(.text+0x3fa): undefined reference to "pagera_"
3-life_parallelo.f90:(.text+0x3ff): undefined reference to "nobar_"
3-life_parallelo.f90:(.text+0x404): undefined reference to "intax_"
3-life_parallelo.f90:(.text+0x438): undefined reference to "setgrf_"
3-life_parallelo.f90:(.text+0x46d): undefined reference to "autres_"
3-life_parallelo.f90:(.text+0x4c7): undefined reference to "graf3_"
3-life_parallelo.f90:(.text+0x4db): undefined reference to "ticks_"
3-life_parallelo.f90:(.text+0x4e0): undefined reference to "cross_"
3-life_parallelo.f90:(.text+0x529): undefined reference to "crvmat_"
3-life_parallelo.f90:(.text+0x52e): undefined reference to "endgrf_"
3-life_parallelo.f90:(.text+0x56d): undefined reference to "dwgmsg_"
collect2: error: ld returned 1 exit status
我是如何编译的dislin.mod
cd /usr/local/dislin/gf/: sudo gfortran -c dislin.f90
cd real64: sudo gfortran -c dislin.f90
我如何使用 dislin 库
SUBROUTINE showgrid( griglia, numx, numy, nloop )
USE DISLIN
IMPLICIT NONE
INTEGER, INTENT(IN) :: griglia(numx,numy)
INTEGER, INTENT(IN) :: numx, numy
INTEGER, INTENT(IN) :: nloop
REAL :: extgrid(0:numx+1,0:numy+1)
INTEGER :: nlev
CHARACTER(5) :: sloop
IF ( MAXVAL(griglia)>1 .OR. MINVAL(griglia)<0 ) THEN
STOP "ERRORE: gli elementi della matrice devono essere 1 o 0"
END IF
extgrid( 0 , : )= -1
extgrid( numx+1 , : )= -1
extgrid( : , 0 )= -1
extgrid( : , numy+1 )= -1
extgrid(1:numx,1:numy)= REAL(griglia(:,:))
WRITE(UNIT=sloop, FMT='(I4)') nloop
CALL GETLEV(nlev)
IF (nlev == 0) THEN
CALL METAFL('XWIN')
CALL PAGE(200*numx, 200*numy)
CALL DISINI()
CALL PAGERA()
CALL NOBAR()
CALL INTAX()
CALL SETGRF ("NONE", "NONE", "NONE", "NONE")
CALL AUTRES( (numx+2)*2, (numy+2)*2)
END IF
CALL GRAF3(-1., 1., -1., 1., -1., 1., -1., 1., 0., 1., 0., 1.)
CALL TICKS (0, "XYZ")
CALL CROSS()
CALL CRVMAT(extgrid, numx+2, numy+2, 1, 1)
CALL ENDGRF()
CALL DWGMSG("Generazione numero"//sloop)
END SUBROUTINE showgrid
更新(运行 mpif90 与 gfortran,dislin.mod 由 gfortran 编译)
Cannot read module file 'dislin.mod' opened at (1), because it was
created by a different version of GNU Fortran
"gfortran --version" 和 "mpif90 --version" returns 我都是 4.8.2
mpif90 -v
mpif90 for MPICH version 3.0.4
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
...
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
dislin.mod
是对的。它不是 Amiga 声音文件——尽管您的系统报告它是这样的。它是一个Fortran模块文件,里面存放着你编译的模块中包含的变量和过程的信息。
但是,您似乎使用不同的编译器编译 DISLIN,而不是 mpif90
背后的编译器。根据错误信息,你的 mpif90
是 gfortran。您显然使用了不同的编译器进行安装。
由于.mod
不同编译器生成的文件不兼容,所以无法运行。即使是同一个编译器的不同版本也经常会导致问题。您必须确保使用您打算稍后使用的相同编译器安装该库。
如果您使用预编译版本,则只能将其与为其准备的编译器一起使用。
在您的新问题中,您似乎没有正确 link 库。您必须在包含缺失符号的库中 link。您应该始终显示产生任何错误消息的命令,单独的消息通常是无用的。
好吧,我刚刚安装了 DISLIN,因为我必须将它与 Fortran 和 MPI 一起使用。 但是当我尝试 运行:
mpif90 -I/usr/local/dislin/ifc/ -L/usr/local/dislin -ldislin 3-life_parallelo.f90 -o life
但它总是回复我
USE DISLIN 1 Fatal Error: File 'dislin.mod' opened at (1) is not a GNU Fortran module file
我不知道该怎么办.. 在 /ifc 文件夹中我有 2 个文件:dislin.f90 和 dislin.mod,最后一个是 Audio Amiga SoundTracker (audio/x-mod) 文件类型.所以..我需要一个 dislin.mod fortran 文件..我必须像 "dislin.mod.f90" 一样保存它吗?我不这么认为。
更新(Dislin 库用 gfortran 重新编译,我重新运行 "mpif90 .." 见上文)
/tmp/ccm8YsO3.o: nella funzione "showgrid_":
3-life_parallelo.f90:(.text+0x39f): undefined reference to "getlev_"
3-life_parallelo.f90:(.text+0x3b9): undefined reference to "metafl_"
3-life_parallelo.f90:(.text+0x3f0): undefined reference to "page_"
3-life_parallelo.f90:(.text+0x3f5): undefined reference to "disini_"
3-life_parallelo.f90:(.text+0x3fa): undefined reference to "pagera_"
3-life_parallelo.f90:(.text+0x3ff): undefined reference to "nobar_"
3-life_parallelo.f90:(.text+0x404): undefined reference to "intax_"
3-life_parallelo.f90:(.text+0x438): undefined reference to "setgrf_"
3-life_parallelo.f90:(.text+0x46d): undefined reference to "autres_"
3-life_parallelo.f90:(.text+0x4c7): undefined reference to "graf3_"
3-life_parallelo.f90:(.text+0x4db): undefined reference to "ticks_"
3-life_parallelo.f90:(.text+0x4e0): undefined reference to "cross_"
3-life_parallelo.f90:(.text+0x529): undefined reference to "crvmat_"
3-life_parallelo.f90:(.text+0x52e): undefined reference to "endgrf_"
3-life_parallelo.f90:(.text+0x56d): undefined reference to "dwgmsg_"
collect2: error: ld returned 1 exit status
我是如何编译的dislin.mod
cd /usr/local/dislin/gf/: sudo gfortran -c dislin.f90
cd real64: sudo gfortran -c dislin.f90
我如何使用 dislin 库
SUBROUTINE showgrid( griglia, numx, numy, nloop )
USE DISLIN
IMPLICIT NONE
INTEGER, INTENT(IN) :: griglia(numx,numy)
INTEGER, INTENT(IN) :: numx, numy
INTEGER, INTENT(IN) :: nloop
REAL :: extgrid(0:numx+1,0:numy+1)
INTEGER :: nlev
CHARACTER(5) :: sloop
IF ( MAXVAL(griglia)>1 .OR. MINVAL(griglia)<0 ) THEN
STOP "ERRORE: gli elementi della matrice devono essere 1 o 0"
END IF
extgrid( 0 , : )= -1
extgrid( numx+1 , : )= -1
extgrid( : , 0 )= -1
extgrid( : , numy+1 )= -1
extgrid(1:numx,1:numy)= REAL(griglia(:,:))
WRITE(UNIT=sloop, FMT='(I4)') nloop
CALL GETLEV(nlev)
IF (nlev == 0) THEN
CALL METAFL('XWIN')
CALL PAGE(200*numx, 200*numy)
CALL DISINI()
CALL PAGERA()
CALL NOBAR()
CALL INTAX()
CALL SETGRF ("NONE", "NONE", "NONE", "NONE")
CALL AUTRES( (numx+2)*2, (numy+2)*2)
END IF
CALL GRAF3(-1., 1., -1., 1., -1., 1., -1., 1., 0., 1., 0., 1.)
CALL TICKS (0, "XYZ")
CALL CROSS()
CALL CRVMAT(extgrid, numx+2, numy+2, 1, 1)
CALL ENDGRF()
CALL DWGMSG("Generazione numero"//sloop)
END SUBROUTINE showgrid
更新(运行 mpif90 与 gfortran,dislin.mod 由 gfortran 编译)
Cannot read module file 'dislin.mod' opened at (1), because it was created by a different version of GNU Fortran
"gfortran --version" 和 "mpif90 --version" returns 我都是 4.8.2
mpif90 -v
mpif90 for MPICH version 3.0.4
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
...
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
dislin.mod
是对的。它不是 Amiga 声音文件——尽管您的系统报告它是这样的。它是一个Fortran模块文件,里面存放着你编译的模块中包含的变量和过程的信息。
但是,您似乎使用不同的编译器编译 DISLIN,而不是 mpif90
背后的编译器。根据错误信息,你的 mpif90
是 gfortran。您显然使用了不同的编译器进行安装。
由于.mod
不同编译器生成的文件不兼容,所以无法运行。即使是同一个编译器的不同版本也经常会导致问题。您必须确保使用您打算稍后使用的相同编译器安装该库。
如果您使用预编译版本,则只能将其与为其准备的编译器一起使用。
在您的新问题中,您似乎没有正确 link 库。您必须在包含缺失符号的库中 link。您应该始终显示产生任何错误消息的命令,单独的消息通常是无用的。