7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-29

#はじめに
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 消極的解決).
※どなたか解決策が分かりましたら教えて下さい.

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?