Gtkmm3をMinGWでコンパイルはできたが、exe実行時にエラーダイアログが出て実行できない。
前回までの状況
gtkmm3でコンパイル成功。 しかし、できたexeを実行すると以下のエラーダイアログが表示されて実行できない。
「エントリポイントが見つかりません」 「プロシージャエントリポイント __gxx_personality_v0 がダイナミックリンクライブラリ libstdc++-6.dll から見つかりませんでした。」
対処として以下のようなことをしたが、同様のエラーがでて解決できず。
- 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
- GTK+3(
- g++
- g++ -std=c++11 -Wl,-rpath=C:/tools/mingw32/bin -o simple.exe simple.cc
pkg-config gtkmm-3.0 --cflags --libs
-mwindows
- g++ -std=c++11 -Wl,-rpath=C:/tools/mingw32/bin -o simple.exe simple.cc
原因の予想
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を使えばいいかも?
- コンパイル状況を把握する(バージョン違いのgcc,g++を使っていることが原因だという推測が成立するか確認)
- gcc,g++はどちらも5.3.0を使うようにする(環境変数をそのように設定する?)
- 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
知らなかったけど、このTDM-GCCとやらでも環境をつくれるのか? でも、msysはあるのだろうか?
mingw-get.exe
ネットの情報をみても、mingw-get.exeで入手するのが正攻法っぽい。
でも、以前ダウンロードしようとしてもチェックを入れたら画面が消えてしまってできなかった。
ところが今回、インストール時にディレクトリをC:\MinGW
からC:\MinGW_GET
にして変更してみたら、インストールできた。
…え?
所感
状況を整理したい。
とりあえずインストールできるならやってみよう。 次回はMinGWをmingw-get.exeでインストールしてみる。
その環境でGTKmm3をコンパイルしなおせば、今回の問題が解決するかもしれない。