2017-10-20 184 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 -funderscoring -O0 -g -Wall -c -fmessage-length=0 -fopenmp -o "MAXBRG3D.o" "../MAXBRG3D.f90" 

我看到下面的鏈接:gfortran can't find OpenMP library (omp_lib.mod) under MinGW 當我運行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代碼。 (\ LIB \ GCC \的mingw32 \ 6.3.0位於MinGW的)和libgomp-1.dll文件(位於MinGW的

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, \ BIN)。

+0

你從哪裏得到你的gfortran?你使用Cygwin?什麼'gfortran -v'打印? –

+0

請嘗試編譯一個簡單的OpenMP Hello world程序,它不使用'omp_lib'模塊。請報告會發生什麼。在您的計算機中是否有任何名爲'libgomp *'的文件(以及其他GCC和gfortran庫)? –

+0

我在Windows上使用MinGW。我沒有使用Cygwin。 –

回答

1

我已經解決了這個問題。我註釋掉了USE OMP_LIB行,並且我剛剛初始化了我想要使用的函數。

以前我發現了初始化功能

INTEGER FUNCTION OMP_GET_THREAD_NUM() 

這是不工作的例子。然而,我發現了一個不同的例子,它將函數初始化爲整數。所以

INTEGER OMP_GET_THREAD_NUM 

這似乎已經解決了這個問題,現在的代碼被編譯並運行。

+0

在Fortran中,它是USE omp_lib,默認爲.mod。正如你引用它,它會想要omp_lib.mod.mod。您可能需要將-I(大寫I)設置爲指向編譯器的include目錄。 – tim18

+0

@ tim18這可能只是一個錯字,看看錯誤信息。 –

+1

使用隱式接口確實是我想到的一種可能性。這是一種解決方法,而不是一個完整的解決方案。它使你的代碼變得更糟,並且會讓第三方代碼變得痛苦。但是,如果你足夠了,那麼你很好。 –