Edited at

MinGWでlibgomp-1.dllがstatic linkできない問題(gcc, OpenMP)

More than 3 years have passed since last update.


はじめに

MinGWでOpenMPライブラリを使ってマルチスレッド計算させるプログラムをgccでコンパイルすると,libgomp-1.dllがstatic linkできない問題にぶち当たりました.

結論から言うと消極的解決(libgomp-1.dll等を同ディレクトリに置く)以外の解決法が見つからなかったので,書き残しておきます.


MinGWにPthreadを導入

そもそもMinGWでOpenMPを使っているプログラムをコンパイルするにはPthreadを導入する必要があります.以下のようにしてPthreadを導入します.


sourceforgeのmingwプロジェクトのpthreadのページから次のファイルをダウンロードする.


  • pthreads-w32-2.9.1-1-mingw32-dev.tar.lzma

  • pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma

(lzmaで圧縮されているので7zip解凍する)

解凍したら以下のファイルをMinGWディレクトリ以下にコピーする.


pthreads-w32-2.9.1-1-mingw32-dev

- include/

-- pthread.h

-- sched.h

-- semaphore.h

- lib/

-- libpthreawd.a

-- libpthread.dll.a

-- libpthreadGC2.a

-- libpthreadGC2.dll.a

-- libpthreawdGCE2.dll.a

pthreads-w32-2.9.1-1-mingw32-dll

- bin/

-- pthreadGC2.dll

-- pthreadGCE2.dll


上記のファイルをc:\MinGW以下のディレクトリのbin, include, libの中にそれぞれコピーする.


参考 demura.net | Windows用pthreadインストールメモ

http://demura.net/misc/10817.html




MinGWのgccでコンパイル

さてコンパイルします.普通にコンパイルすると例えばlibgcc_s_dw2-1.dllなどのライブラリがダイナミックリンクとなってしまい,環境が変わると少々面倒です.

gccやg++のオプションで,-static-libgcc-static-libstdc++を指定しましょう.指定しないとこうなります.

スクリーンショット 2015-12-29 19.15.48.png

スクリーンショット 2015-12-29 19.14.40.png


MinGWのgccでOpenMPプログラムをコンパイル

本題です.gccで-fopenmpフラグを付けてOpneMPプログラムを普通にコンパイルすると,libgomp-1.dllがstatic linkになりません.

スクリーンショット 2015-12-29 19.19.33.png

gccのオプションに-static-libompみたいなのあるのかなと思いましたが,そういうのは無いようです.

色々調べてみましたが,同じ問題にぶつかっている人はいるようですが,解決している例がありません.


MinGW-users - OpenMP static build (link pthread statically)

http://mingw-users.1079350.n2.nabble.com/OpenMP-static-build-link-pthread-statically-td7583565.html


結局libgomp-1.dllc:/MinGW/binからバイナリと同じディレクトリにコピーしてきて解決を図りました.すると,「libgomp-1.dllが無いよ!」のエラーは(当然)消えましたが,「libgcc_s_dw2-1.dllが無いよ!」と「pthreadGC2.dllが無いよ!」のエラーが新たに登場するようになりました.libgcc_s_dw2-1.dllに至っては-static-libgccしているので完全に謎です.

スクリーンショット 2015-12-29 19.48.18.png

スクリーンショット 2015-12-29 19.48.13.png

仕方がないので,libgcc_s_dw2-1.dll (c:/MinGW/binにある) と,pthreadGC2.dll (Pthreadの導入時に持ってきたもの.c:/MinGW/binにある) をそれぞれコピーしてきて,無事に実行できるようになりました.


まとめ

MinGWのgccで-fopenmpしたら,



  • -static-libgccを付ける


  • -static-libstdc++を付ける


  • libgomp-1.dll を同梱


  • libgcc_s_dw2-1.dll を同梱


  • pthreadGC2.dll を同梱

とすれば,別環境―MSYS以外の例えばコマンドプロンプト等でも実行ができるようになりました(The 消極的解決).

※どなたか解決策が分かりましたら教えて下さい.