LoginSignup
31
32

More than 5 years have passed since last update.

go-qmlをWindowsで使う

Last updated at Posted at 2015-03-22

Windowsを含むクロスプラットフォーム対応で、Go言語でGUIを使う方法として、go-qmlというものを試してみました。

今回は、以下の2つの環境を構築しました。

  • 32bitアプリ構築環境
    • Go 1.4.2 amd64 (32bit向けクロスコンパイル)
    • Qt 5.4.1 (MinGW 4.9.1 32bit版) 公式バイナリを利用。
  • 64bitアプリ構築環境
    • Go 1.4.2 amd64
    • Qt 5.4.1 (MinGW-w64 4.9.2 64bit版) MSYS2によるバイナリを利用。

※追記
本記事初出時はGo 1.4.2を使用していましたが、Go 1.5以降の使用を推奨します。(詳細は後述)

32bitアプリ構築環境

Goの32bit向けクロスコンパイル環境の準備

64bit版のGoコンパイラを使って、32bit版バイナリをコンパイルするには、クロスコンパイル環境を準備する必要があります。「golang でのクロスコンパイルの留意事項 — KaoriYa」にあるように、64bit版のgccにパスが通っている必要があります。今回は、MSYS2からgccをインストールすることにしましょう。

sh
pacman -S mingw-w64-x86_64-gcc

64bit版gccは、C:\msys64\mingw64\binにインストールされるので、そこにPATHを通し、必要な環境変数を設定してmakeを実行します。

batch
set GOOS=windows
set GOARCH=386
path C:\msys64\mingw64\bin;%path%
cd %GOROOT%\src\
make

Qtのインストール

Qt - Download Open Source Step 3から"Qt Online Installer for Windows"をダウンロードし、インストーラを実行します。
コンポーネントの選択画面で、Qt→Qt 5.4→MinGW 4.9.1 (32bit) OpenGL を選択し、インストールします。

qt-setup.png

既に、別のコンパイラ向けのQtをインストール済みの際は、スタートメニューからQt Maintenance Toolを実行し、パッケージマネージャを選択すると、この画面になります。

Qtは、C:\Qt\5.4\mingw491_32にインストールされます。また、依存関係により、32bit版MinGW 4.9.1がC:\Qt\Tools\mingw491_32にインストールされます。

pkg-config用設定ファイルの修正

go-qml > windows release build にあるとおり、QtのMinGW版公式バイナリは、pkg-configの設定ファイルが、デバッグ版DLLにリンクする設定となっています。
C:\Qt\5.4\mingw491_32\lib\pkgconfig にある *.pc ファイルを見ると、例えば、Qt5Core.pc の場合、-lQt5Cored のようにライブラリ名の末尾に d がついていることが分かります。
例えば次のようにして、末尾の d を削除することで、リリース版DLLにリンクするように出来ます。

sh
$ cd 'C:\Qt\5.4\mingw491_32\lib'
$ mv pkgconfig pkgconfig-debug
$ mkdir pkgconfig
$ cd pkgconfig-debug
$ for i in *.pc; do awk '{ if ($1 == "Libs:") { sub(/d *$/, " ", $0) } print }' $i > ../pkgconfig/$i; done
$ cd ../pkgconfig
$ unix2dos *.pc

pkg-configのインストール

go-qmlをインストールするには、pkg-configが必要になります。これもMSYS2からインストールします。32bit版のpkg-configは、C:\msys64\mingw32\binにインストールされます。

sh
pacman -Ssq pkg-config  # pkg-configという名前を持つパッケージを検索
pacman -S mingw-w64-i686-pkg-config

なお、C:\msys64\usr\binにインストールされるMSYS2用のpkg-configは、パスの扱い(特に\)が異なるため使用できません。

go-qmlのインストール

必要な環境変数を設定した上で、go getでgo-qmlをインストールします。Goのクロスコンパイル環境構築の際とは異なり、Qtと一緒にインストールされた32bit版MinGW 4.9.1を使用します。

batch
set GOOS=windows
set GOARCH=386
set QTDIR=C:\Qt\5.4\mingw491_32
rem pkg-configにパスを通す。
path c:\msys64\mingw32\bin;%path%
set PKG_CONFIG_PATH=%QTDIR%\lib\pkgconfig
rem QtとMinGWにパスを通す。
%QTDIR%\bin\qtenv2.bat
cd %GOPATH%
rem クロスコンパイル時は、cgoが使用可能であることを明示する必要あり。
set CGO_ENABLED=1
go get gopkg.in/qml.v1

エラーが出なければgo-qmlのインストールは完了です。

なお、set CGO_ENABLED=1を設定していない場合は、以下のようなエラーメッセージが表示されてしまいます。

can't build package gopkg.in/qml.v1 because it contains C++ files (all.cpp) but it's not using cgo nor SWIG

サンプルプログラムのビルドと実行

batch
cd %GOPATH%\src\gopkg.in\qml.v1\examples\controls\gallery
go build -ldflags="-H windowsgui"

うまくいけば、gallery.exeが作成されますので、それを実行すると以下のような画面が表示されるはずです。

qt-component-gallery.png

ただしWindows版 Go 1.4.x(あるいはそれ以前)は、外部リンカが使えない制約があるため、go-qmlがクラッシュしてしまいます。Go 1.5以降を使えば問題ありませんが、Go 1.4.xを使う場合は「Windows support (until external linking will be supported by go build) by neclepsio · Pull Request #149 · go-qml/qml」のPRを適用することで、Windowsでも動作するようになります。

batch
rem PR#149を取得し、ビルド&インストール。
cd %GOPATH%\src\gopkg.in\qml.v1
git checkout -b neclepsio_v1
git pull https://github.com/neclepsio/qml.git v1
go install -a

rem サンプルプログラムをビルド。
cd %GOPATH%\src\gopkg.in\qml.v1\examples\controls\gallery
go build -ldflags="-H windowsgui"

64bitアプリ構築環境

Qtのインストール

QtのMinGW 64bitビルド環境は、Qtの公式インストーラからはインストールできません。そこで、MSYS2からQtをインストールすることにします。

sh
pacman -S mingw-w64-x86_64-qt5

pkg-configのインストール

go-qmlをインストールするには、pkg-configが必要になります。これもMSYS2からインストールします。64bit版のpkg-configは、C:\msys64\mingw64\binにインストールされます。

sh
pacman -S mingw-w64-x86_64-pkg-config

go-qmlのインストール

必要な環境変数を設定した上で、go getでgo-qmlをインストールします。クロスコンパイルではないため、32bit環境に比べ、必要な環境変数はかなり少なくなっています。

batch
set GOOS=windows
set GOARCH=amd64
path c:\msys64\mingw64\bin;%path%
cd %GOPATH%
go get gopkg.in/qml.v1

サンプルプログラムのビルドと実行

batch
cd %GOPATH%\src\gopkg.in\qml.v1\examples\controls\gallery
go build -ldflags="-H windowsgui"

うまくいけば、gallery.exeが作成されます。
Go 1.4.x以前を使用したためにgallery.exeがクラッシュする場合は、32bit版と同様に、PR#149を適用してください。

Tips

ビルド時に-ldflags-sを指定すると、デバッグシンボルが削除され、実行ファイルのサイズが小さくなります。

go build -ldflags="-H windowsgui -s"

参考サイト

その他のGo用GUIライブラリ

その他のGo用のGUIライブラリとしては以下のようなものがあります。

31
32
7

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
31
32