ワテのブログ

The fundamental things apply As time goes by.

2014年11月4日火曜日

[golang/cgo] cgoのサンプル - wxWidgetsとgoの組み合わせ

概要

cgoのサンプルを作成しました。
cgoを使ってgoとwxWidgets(C++)を組み合わせています。

ファイル構成

  • widgets.go
  • ui.h
  • ui.cpp

cgoの設定

widgets.goで設定しています。
cgo directivesという
#cgo
で始まるコマンドでコンパイル時やリンク時のオプションを設定できます。
cgo directivesはMacとLinuxなどプラットフォーム毎に定義できます。

#cgo linux ...
#cgo darwin ...

と書くことでプラットフォーム毎に別のオプションを設定できます。

CPPFLAGSLDFLAGSwx-configから取得したものをコピペしました。
wx-configはwxWidgetsの設定を表示するコマンドです。
wxWidgetsをインストールすると使えます。

$ wx-config --cppflgas
$ wx-config --ldflags

そのあと、ui.hをインクルードしています。
これで、ui.hで定義されているものをgoの世界から参照できます。

ui.hではdarwuiという関数をexternで宣言しています。

ビルド

事前にwxWidgets-3.0のインストールが必要です。

$ go build

でビルド可能です。

動作

$ ./widgets
  1. goのmainからwxAppを初期化・実行し、Windowを表示します(ui関数内の処理)
  2. Fileメニュー → Newを選択する
  3. wxWidgets側からgoの関数drawRoutineを3呼び出します
  4. drawRoutine関数では描画用のC++の関数drawを呼び出すgo routineを起動します。
  5. この処理はgoroutineでで並列化されます
  6. 赤・青・緑色でランダムに円が描画されます

追加(2014/11/5)

linux版にXInitThreads()を追加しました。 これがないと描画中に落ちます。

関連項目

0 件のコメント:

コメントを投稿