やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

MinGWでHelloWorld(Gtkmm3版)に失敗した原因をさぐる

Gtkmm3をMinGWコンパイルはできたが、exe実行時にエラーダイアログが出て実行できない。

前回までの状況

gtkmm3でコンパイル成功。 しかし、できたexeを実行すると以下のエラーダイアログが表示されて実行できない。

「エントリポイントが見つかりません」 「プロシージャエントリポイント __gxx_personality_v0 がダイナミックリンクライブラリ libstdc++-6.dll から見つかりませんでした。」

ErrorDialog

対処として以下のようなことをしたが、同様のエラーがでて解決できず。

  • exeがあるディレクトリに以下のDLLを配置した
    • GTK+3(C:\MinGW\msys\1.0\gtk+3\bin
      • libatk-1.0-0.dll
      • libgdk_pixbuf-2.0-0.dll
      • libgio-2.0-0.dll
      • libglib-2.0-0.dll
      • libgobject-2.0-0.dll
      • libpango-1.0-0.dll
      • libsigc-2.0-0.dll
    • GTKmm3(C:\MinGW\msys\1.0\gtkmm3\bin
      • libatkmm-1.6-1.dll
      • libcairomm-1.0-1.dll
      • libgdkmm-3.0-1.dll
      • libgiomm-2.4-1.dll
      • libglibmm-2.4-1.dll
      • libglibmm_generate_extra_defs-2.4-1.dll
      • libgtkmm-3.0-1.dll
      • libpangomm-1.4-1.dll
    • MinGW5.3.0(C:/tools/mingw32/bin
      • libatomic-1.dll
      • libgcc_s_sjlj-1.dll
      • libgfortran-3.dll
      • libgomp-1.dll
      • libgomp-plugin-host_nonshm-1.dll
      • libquadmath-0.dll
      • libssp-0.dll
      • libstdc++-6.dll
      • libvtv-0.dll
      • libvtv_stubs-0.dll
      • libwinpthread-1.dll
  • g++
    • g++ -std=c++11 -Wl,-rpath=C:/tools/mingw32/bin -o simple.exe simple.cc pkg-config gtkmm-3.0 --cflags --libs -mwindows

原因の予想

GTKmm3をコンパイルした環境に原因があるかもしれない。

MinGWの環境構築をふりかえる

MinGWのバージョンが混在した状態でgtkmm3をコンパイルしていた。

  • gcc 4.6.2
  • msysが1.0(gcc4.6.2と同時期)
  • g++がなかったので、chocolateyで別途インストールした
    • g++ 5.3.0

今の環境としては、バージョン違いのMinGWが2つある状態。

MinGW gcc g++ msys インストール方法 パス
4.6.2? 4.6.2 1.0 記憶にない… C:/MinGW/
5.3.0 5.3.0 5.3.0 Chocolatey C:/tools/mingw32/

このへんのインストールは過去ログにある。

今回のエラーは環境のせい?

libstdc++-6.dllはg++5.3.0にしか存在しなかった。gcc4.6.2にはなかった。 だったら、g++5.3.0のlibstdc++-6.dllを配置すれば解決しそうなもの。 なのに、解決せず先述のエラー。

エラー文言から察するに、libstdc++-6.dllには__gxx_personality_v0という関数があるはず。 少なくともhello.exeはそう見ている。でも、g++5.3.0のlibstdc++-6.dllにはないのだろう。 だから先述のエラーが出た。そういうことに思える。

なら、4.6.2にならあるのだろうと思う。でも、4.6.2にはそもそもg++がインストールされていないし、全サブフォルダを検索してもlibstdc++-6.dllは存在しなかった。 ようするに、libstdc++-6.dllというファイルはg++5.3.0にしかない。

ならそのlibstdc++-6.dllがあればいいはずだと思うが、実際にはエラーが出る。

hello.exeから見ればlibstdc++-6.dllには__gxx_personality_v0という関数があるはずだと見ている。

もしかしたら、gcc4.6.2版のg++をインストールしていたら、__gxx_personality_v0という関数があるlibstdc++-6.dllがあったのかもしれない。でも今回はg++5.3.0を使っている。5.3.0のlibstdc++-6.dllには__gxx_personality_v0という関数がない。だから今回のエラーになったのかもしれない。

ようするに、gccとg++のバージョンが一致していれば、この問題は出ないのではないか?

gtkmmコンパイルするとき、gcc4.6.2とg++5.3.0を使ったはず。でも、バージョンが違うことによって何らかの差異が出たのかもしれない。それが今回のエラーの原因かもしれない。gccとg++のバージョンをあわせる必要があるのではないか。

環境を用意できなかった

もしそうなら環境を用意できない。こちらの手順 1) ではgtkmm3をコンパイルするにはmsysが必要だと書いてある。msysがあったのはgcc4.6.2だが、こちらはg++がインストールされていなかった。今現時点で、g++4.6.2を入手する手立てが見つけられない。

仕方なくchocolateyでMinGWをインストールした。そこにはgcc,g++が入っていたが、msysはなかった。msysをインストールしようとしてもできなかった。msys2ならchocolatey上にあったが、WindowsXPのせいか私の環境にはインストールできなかった。

解決案?

もしかして、MinGW5.3.0のgccとg++を使い、MinGW4.6.2のmsys1.0を使えばいいかも?

  1. コンパイル状況を把握する(バージョン違いのgcc,g++を使っていることが原因だという推測が成立するか確認)
  2. gcc,g++はどちらも5.3.0を使うようにする(環境変数をそのように設定する?)
  3. msysはMinGW4.6.2の中にあったものを使う(それしかない。新たに入手もできない)

コンパイルの状況をログで解析する

そもそも、どういう状況でコンパイルしたのか、どんな条件ならよかったのか、まったく把握できていない。

たぶん、gcc(4.6.2)でコンパイルしたと思う。でも、gtkmm3はC++言語だからgcc(4.6.2)でなくg++(5.3.0)を使うはず。 これが事実かどうかを確かめる。

以前、gtkmm3をコンパイルしたときのC:\MinGW\msys\1.0\home\logs内にあるログファイルを見てみる。 gcc,g++のキーワードで文字列検索。それっぽいのは見当たらない。

C:\MinGW\msys\1.0\home\libsigc++-2.2.11\config.logなど、各gtkライブラリのconfig.logファイルで同様にgccで文字列検索する。 以下のように、異なるバージョンのgcc(g++)を使っているらしきログが見つかった。

COLLECT_GCC=c:\tools\mingw32\bin\g++.exe
COLLECT_LTO_WRAPPER=c:/tools/mingw32/bin/../libexec/gcc/i686-w64-mingw32/5.3.0/lto-wrapper.exe
Target: i686-w64-mingw32
gcc version 5.3.0 (i686-posix-sjlj-rev0, Built by MinGW-W64 project) 

gcc.exe (GCC) 4.6.2
COLLECT_GCC=C:\MinGW\bin\gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe
Target: mingw32
gcc version 4.6.2 (GCC) 

gccとg++のバージョンが違うから問題になったのではないだろうか。 もしかしたら、gtkmm3をコンパイルするとき、gccとg++の両方を使ったのかもしれない。 そのせいで、バージョンによる差異が出たのかもしれない。

まったく何の根拠もないが。

知らないことだらけ

原因の予想すらおぼつかない。

そもそもコイツら何なの?

http://amekujira.seesaa.net/article/420665358.html

http://d.hatena.ne.jp/m-hiyama/20151013/1444704189

Git for Windows は msysベース。代用できる? こちらの手順 1) ではmsys-baseとやらが必要とある。それがGit for Windowsに含まれているか不明。 そもそもmsys-baseとやらが具体的に何を指しているのか分からない。何かのDLL?

TDM-GCC

http://tdm-gcc.tdragon.net/

知らなかったけど、このTDM-GCCとやらでも環境をつくれるのか? でも、msysはあるのだろうか?

mingw-get.exe

ネットの情報をみても、mingw-get.exeで入手するのが正攻法っぽい。

でも、以前ダウンロードしようとしてもチェックを入れたら画面が消えてしまってできなかった。

ところが今回、インストール時にディレクトリをC:\MinGWからC:\MinGW_GETにして変更してみたら、インストールできた。

…え?

所感

状況を整理したい。

とりあえずインストールできるならやってみよう。 次回はMinGWmingw-get.exeでインストールしてみる。

その環境でGTKmm3をコンパイルしなおせば、今回の問題が解決するかもしれない。