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

#はじめに
MinGWでOpenMPライブラリを使ってマルチスレッド計算させるプログラムをgccでコンパイルすると，libgomp-1.dllがstatic linkできない問題にぶち当たりました．
結論から言うと消極的解決（libgomp-1.dll等を同ディレクトリに置く）以外の解決法が見つからなかったので，書き残しておきます．

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

>sourceforgeのmingwプロジェクトの[pthreadのページ](http://sourceforge.net/projects/mingw/files/MinGW/Base/pthreads-w32/pthreads-w32-2.9.1/)から次のファイルをダウンロードする．

>+ 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](https://qiita-image-store.s3.amazonaws.com/0/57626/e2022b24-672f-4d5a-e698-472cf9026d3e.png)

![スクリーンショット 2015-12-29 19.14.40.png](https://qiita-image-store.s3.amazonaws.com/0/57626/89757d42-53a3-cf0c-ee0d-0a222cb62754.png)

#MinGWのgccでOpenMPプログラムをコンパイル
本題です．gccで-fopenmpフラグを付けてOpneMPプログラムを普通にコンパイルすると，`libgomp-1.dll`がstatic linkになりません．
![スクリーンショット 2015-12-29 19.19.33.png](https://qiita-image-store.s3.amazonaws.com/0/57626/74a6dd7c-d469-6c30-3907-c55775efe16d.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

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr"><a href="https://twitter.com/tonets">@tonets</a> ここ (<a href="https://t.co/HkHGQjNSAI">https://t.co/HkHGQjNSAI</a> 比較的最近のスレ) で詳しく議論されてるっぽいですが、libgomp が pthread に依存してて、pthread の設計思想が static を許してないから無理みたいな（無理）</p>&mdash; 5 o&#39;clock (@inferist) <a href="https://twitter.com/inferist/status/681658247426617344">December 29, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr"><a href="https://twitter.com/tonets">@tonets</a> さっきのスレでも「再配布可能なんだし同梱しちまえばいいだろ」って斬って捨てられてますたｗ <a href="https://t.co/EB1Lr1ZHtl">pic.twitter.com/EB1Lr1ZHtl</a></p>&mdash; 5 o&#39;clock (@inferist) <a href="https://twitter.com/inferist/status/681659831296499712">December 29, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

結局`libgomp-1.dll`を`c:/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](https://qiita-image-store.s3.amazonaws.com/0/57626/465b8c2c-972a-4520-22aa-ed55b7ce5291.png)
![スクリーンショット 2015-12-29 19.48.13.png](https://qiita-image-store.s3.amazonaws.com/0/57626/1c7b2240-21a9-9948-5f82-7cbea426c870.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 消極的解決）．
※どなたか解決策が分かりましたら教えて下さい．