Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows gfortran can';使用MinGW找不到OpenMP库(omp_lib.mod)_Windows_Fortran_Mingw_Openmp_Gfortran - Fatal编程技术网

Windows gfortran can';使用MinGW找不到OpenMP库(omp_lib.mod)

Windows gfortran can';使用MinGW找不到OpenMP库(omp_lib.mod),windows,fortran,mingw,openmp,gfortran,Windows,Fortran,Mingw,Openmp,Gfortran,我正在尝试编译一个包含OpenMP的Fortran代码。我正在从不同的代码复制OpenMP的使用。它昨天成功构建了一次,然后在下次构建时,我得到以下错误: ../MAXBRG3D.f90:3:4: USE OMP_LIB ! USED WITH OMP FUNCTIONS 1 Fatal Error: Can't open module file 'omp_lib.mod' for reading at (1): No such file or directory com

我正在尝试编译一个包含OpenMP的Fortran代码。我正在从不同的代码复制OpenMP的使用。它昨天成功构建了一次,然后在下次构建时,我得到以下错误:

../MAXBRG3D.f90:3:4:

 USE OMP_LIB      ! USED WITH OMP FUNCTIONS
    1
 Fatal Error: Can't open module file 'omp_lib.mod' for reading at (1): No such file or directory
compilation terminated.
subdir.mk:329: recipe for target 'MAXBRG3D.o' failed
make: *** [MAXBRG3D.o] Error 1
我对代码所做的唯一更改是注释掉一些与OpenMP功能无关的代码部分。我已经删除了评论,但仍然得到相同的错误。我的编译命令如下

gfortran -funderscoring -O0 -g -Wall -c -fmessage-length=0 -fopenmp -o "MAXBRG3D.o" "../MAXBRG3D.f90"
我看到了以下链接: 当我运行
gfortran-v时,会显示-enable libgomp

>gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --with-isl=/mingw --prefix=/mingw --disable-win32-registry --target=mingw32 --with-arch=i586 --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --with-tune=generic --enable-libgomp --disable-libvtv --enable-nls
Thread model: win32
gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
我能够运行下面的小Fortran代码

PROGRAM TEST
  INTEGER M
  REAL C(3), D(3)

  M=3
  C(1) = 2
  C(2) = 5
  C(3) = 10
  call A1(M,C,D)
  write(*,5)D(3)
  5 format(1x,'D3=',G12.5)
END PROGRAM

SUBROUTINE A1(N, A, B)
  INTEGER I, N
  REAL B(N), A(N)
!$OMP PARALLEL DO !I is private by default
  DO I=2,N
    B(I) = (A(I) + A(I-1)) / 2.0
  ENDDO
!$OMP END PARALLEL DO
END SUBROUTINE A1

还有libgomp.a、libgomp.dll.a、libgomp.spec(位于MinGW\lib\gcc\mingw32\6.3.0)和libgomp-1.dll(位于MinGW\bin)。我已经解决了这个问题。我注释掉了
USE OMP_LIB
行,并初始化了我想要使用的函数

之前我发现了一个将函数初始化为

INTEGER FUNCTION OMP_GET_THREAD_NUM()
这是行不通的。然而,我发现了一个不同的例子,它将函数初始化为整数。所以

INTEGER OMP_GET_THREAD_NUM

这似乎解决了问题,现在代码正在编译和运行。

您从哪里获得gfortran?你用Cygwin吗?
gfortran-v
打印什么?请尝试编译一个简单的OpenMP Hello world程序,该程序不使用
omp库
模块。请报告发生了什么。在您的计算机中(在其他GCC和gfortran库中)是否有名为
libgomp*
的文件?我正在windows上使用MinGW。我没有使用Cygwin。还显示生成错误消息的确切gfortran命令。我们需要查看
-fopenmp
,但更准确的是整个命令。我甚至不确定模块文件是否存在,现在无法检查。如果是的话,那么从同一版本的其他gfortran复制它可能会有所帮助(或者没有)。在Fortran中,它是使用omp_lib,并隐含.mod。正如你所引用的,它需要omp_lib.mod.mod。您可能需要设置-I(大写字母I)来指向编译器的include目录。@tim18这可能只是一个输入错误,请看错误消息。我确实考虑过使用隐式接口的可能性。这只是一个变通办法,而不是一个完整的解决方案。这会让你的代码变得更糟糕,而且会让第三方代码感到痛苦。但如果对你来说足够的话,你就没事了。