Cygwin64を試してみました。

長い間Cygwinをアップデートしていなかったので、そろそろアップデートしたいと常々思っていました。ただ、現在開発中のプログラムがあるので、アップデートすることでそれらが動かなくなったり挙動が変わると嫌なため、二の足を踏んでいたのです。

久々にCygwinのサイトを訪問してみると、以前はsetup.exeが1種類しかなかったのに、32ビット版と64ビット版の両方が公開されているではないですか! 今回は、64ビット版Cygwinを試したときに感じたことを思いつくまま書き留めることにします。

やや恐る恐るではありましたが、64ビット版のほうをダウンロードしてインストールしてみることにしました。すると、32ビット版と区別するためにC:\Cygwin64にインストールされるようになっていました(もちろん、インストール先のディレクトリは変更可能です)。

何とかなるだろうと進めると…

何とかなったのですが、ディレクトリは32ビット版と64ビット版で分かれるのですが、スタートメニューのフォルダは同じものを使い回すようです。Teminalに関しては、Cygwin TerminalとCygwin64 Terminalの2つができるのでよいのですが、Cygwin-xの中は上書きになってしまうようです。

まあ、X Windowに関しては、64ビット版が立ち上がっていればそれでかまわないので、これでもよいといえばよいのでしょうが…。

それから、CygwinのGCCで-mno-cygwinがサポートされなくなって久しいのですが、どうやらオプションではなくそれ相応のコマンドを実行することでMinGWのコンパイルもできることが分かりました。

32ビット版のMinGWであれば、

i686-w64-mingw32-gcc

を、64ビット版のMinGWであれば、

x86_64-w64-mingw32-gcc

を実行すればよいのです。

ただし、CygwinのGCCが4.8.2なのに対して、MinGWのGCCは4.8.1で、微妙に古いバージョンになっています。これは、MinGW(正確にはMinGW-w64)が正式にサポートしているバージョンに引っ張られているような気がするので致し方ないでしょう。

実際、4.8系であればC++11の機能もほぼフルスペックで使えますので、実用上の問題はないはずです。一つ難を挙げると、スレッドモデルがposixではなくwin32ですので、std::threadが使えないことでしょうか。

スレッドモデルがwin32なのは本家のMinGWもそうなので当然といえば当然です。MinGW-w64の場合、さまざまなオプションでビルドされたバイナリが公開されていますので、スレッドモデルがposixのものを選ぶこともできます。必要なら、それらをダウンロードしてきた方がよいでしょう。

ところで、Cygwin64に付属のMinGWでC++のプログラムをビルドすると、libstdc++-6.dllが見つからない旨のエラーが出て実行することができません。libstdc++-6.dllは、/usr/x86_64-w64-mingw32/sys-root/mingw/binにありますので、必要に応じて環境変数PATHに加えておく必要があります。ただ、32ビット版のMinGWでも同名のDLLですので、使い分けが必要な場合は要注意です。

あと、最近Javaを使う機会が出てきたこともあり、今更ではありますが、GCJを試してみようと思っていました。ところが、Cygwin64にはGCJが提供されていませんでした。

今まで使っていた32ビット版のCygwinにはGCJがありましたが、ビルド時に–disable-java-awtが指定されているようでウィンドウを表示できません。SWTはもしかするとできるかもしれませんが、ちょっとしたものを簡単に作りたいだけなのでできればAWTを使いたいのです(SWTがどれだけ簡単なのか、面倒なのかは調べていないのでわかりません)。これは今後の課題になりそうです。