DebianLinuxでGTK+3.0のチュートリアルを試してみた感想

Go言語で、GUIを調べていたらGTK+3.0のバインディングがあるそうです。GTK+はバインディングが豊富でスクリプト言語などでも使えます。良い機会なのでDebian LinuxでC言語を使ったWindow表示を試してみました。

Programer’s Notes – GTK Glade C Programming

が初心者向けのチュートリアルで1つの記事の量も少なく、わかりやすいです。

開発環境構築とHelloworld

https://prognotes.net/2015/06/gtk-3-c-program-using-glade-3/

上記チュートリアルは、はaptでgtkライブラリーのインストールやビルド方法も乗っていて簡単にWindowを表示できました。pkg-config によりライブラリーのインクルードやリンケージは自動です。またビルド時に-export-dynamicが必要になります。最初これをつけていなくてビルドがうまく行きませんでした。

GTK+はGUIビルダーGladeがある

GTK+はWin32APIのように、ほぼ全てをテキストエディターで書いていくと思っていたのですが、かなり昔からGUIビルダーのGladeがあり、これでUIを作成しながら、任意のエディターでコードを書いていけます。

Geanyエディター

Geanyは、タグファイル が用意されているので、gtk-3.16.6.c.tags をダウンロードし、[ツール]->[Load Tags]で、タグファイルを読み込むことで、コード補完が出来ました。

gladeファイルの読み込み

GLADEでGUIを作成した場合は、gtk_builder_add_from_file関数で、.gladeファイルを指定できるのでそれで、ソースコードと.gladeファイルの連携が可能になります。main.cを作成して、GLADEで、window_main.gladeを作成し、無事にWindowを作成できました。

APIは、C++のようにオブジェクトがメソッドを持つわけではないため、gtk_object_xxxxのような形になりますが、補完ができたのでそこまでストレスはありませんでした。

GTK+3.0でWindowを表示して、日本語のタイトルをつけれた!

GTK+3.0の開発はかなり軽い

WindowsのHyper-V仮想環境でDebian+LXDE で動かしていますが、GUIビルダーもエディターのGeanyもホストの環境と同じように快適に動かせています。Ubuntu をデフォルトでインストールすると非常に重いので、先入観でGTKの開発は重そうなイメージを持っていましたが、超軽量でした。

 

VisualStudio2017でLinux用のビルドをする方法(Inferior loaded対応)

VisualStudio2017ではgdbと連携してLinux環境のC/C++開発がVisual Studioで出来るようになりました。Bash on WindowsやHyper-V上のLinuxのGUIアプリなども問題なくビルドできます。この仕組みは「Visual C++ for Linux Development」というそうです。またgithub上で開発されています。

Visual C++ for Linux Development

https://marketplace.visualstudio.com/items?itemName=VisualCPPTeam.VisualCforLinuxDevelopment

https://blogs.msdn.microsoft.com/vcblog/2017/02/08/targeting-windows-subsystem-for-linux-from-visual-studio/

Loaded ‘/lib/x86_64-linux-gnu/libc.so.6’. Cannot find or open the symbol file.

実際に上記のURLなどを参考に環境を構築して試してみて見たら以下のエラーが発生しました。

対応としては、初期設定のデバックモードをgdbserverからgdbに変更すればひとまず対応できるようです。

初期設定はgdbserverですが、gdbの場合は、Linux環境にシェルで接続してgdbを動かすようです。gdbserverの場合はローカル(=Windows)でgdbを動作させてgdbserverに接続するようなのでポート設定などが必要なのかもしれません。

 

https://github.com/Microsoft/VSLinux/issues/86

 

C言語でBrainfuckを実装

C言語でBrainfuckを実装しました。モダンなC言語はint型などを使わないようなので試しにuint8_tを使ったりstrlen_sを使ってみました。[]括弧の2重ループは、参考にした資料が分かりやすかったのでそのまま使いました。BrainfuckはC言語だと、配列のポインターが、データポインターになり、入力ソースコードの文字列のインデックスが、命令ポインターになるので、Wikipedia に書かれている通りに実装できます。