2017-10-20 18 views
0

OpenMPを含むFortranコードをコンパイルしようとしています。私は別のコードからOpenMPの使用を複製しています。昨日はいったん正常にビルドし、その後、私はそれを構築し、次回は、私は次のエラーを取得する:gfortranはMinGWを使用してOpenMPライブラリ(omp_lib.mod)を見つけることができません

../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 can't find OpenMP library (omp_lib.mod) under MinGW を、私はgfortran -v, --enable-libgompを実行したときに表示します:

gfortran -funderscoring -O0 -g -Wall -c -fmessage-length=0 -fopenmp -o "MAXBRG3D.o" "../MAXBRG3D.f90" 

私は次のリンクを見てきました。

>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)。

+0

gfortranはどこから手に入りましたか? Cygwinを使用していますか? 'gfortran -v'は何を出力しますか? –

+0

'omp_lib'モジュールを使用しない単純なOpenMP Hello Worldプログラムをコンパイルしてみてください。何が起こったか報告してください。あなたのコンピュータに 'libgomp *'というファイルがありますか(他のGCCライブラリとgfortranライブラリの中でも)? –

+0

私はMinGWをWindows上で使用しています。私はCygwinを使用していません。 –

答えて

1

私はこの問題を解決しました。私はUSE OMP_LIB行をコメントアウトし、使用したい機能を初期化しました。

は、以前私はこれは働いていなかった

INTEGER FUNCTION OMP_GET_THREAD_NUM() 

としての機能を初期化した例を見つけました。しかし、関数を整数のように初期化した別の例が見つかりました。したがって

INTEGER OMP_GET_THREAD_NUM 

これは問題を解決したように見え、コードはコンパイルされ実行されているようです。

+0

Fortranでは、.modが暗黙のうちに使用されているomp_libを使用しています。引用したとおり、omp_lib.mod.modが必要になります。コンパイラのインクルードディレクトリを指すように-I(大文字I)を設定する必要があります。 – tim18

+0

@ tim18これはたぶんタイプミスで、エラーメッセージを見てください。 –

+1

暗黙のインターフェイスを使用することは、私が考えている可能性があります。むしろ解決策ではなく、完全な解決策です。それはあなたのコードを悪化させ、第三者のコードで苦痛になるでしょう。しかし、それがあなたのために十分なら、あなたは大丈夫です。 –

関連する問題