#GTK+プログラミングやってみる
着手しはじめた、QEMUのコードリーディングだったのだが
いざ読み始めてたり、調べたりすると
イベントループ処理の流れを理解するにはGLibの動作を知る必要がありそうだということが分かった。
###GLib
出典: フリー百科事典『ウィキペディア(Wikipedia)』
GLib とは、C言語で書かれたクロスプラットフォームのユーティリティライブラリの一種である。
【GTK+プロジェクトの一部】としてスタートしたが、現在では他のアプリケーションでも使われている。
当初は低レベルなコードを入れるためのライブラリとされていたが、現在ではプラットフォーム間の差異を吸収する機能も加えられ、
異なるCPU、OS間でのアプリケーションの移植性を確保するライブラリとしても利用されている。
Glibは、GTK+の一部とのこと
で、GTK+というのは
GUI アプリケーションを作成するためのツールキット(ライブラリ)のひとつ
もともとは GIMP という画像編集ソフトを作成するために開発されたとのこと
GTK+はQtと並んで、Linuxの標準的なGUIツールキットのようだ
ざっとヘルプとか見るとWindowsでいうなら、MFCに近い感じかな。
GUIプログラミングはもっぱらWindows畑で育ったので、LinuxのGUIプログラミングは全くの未経験
ちょっと寄り道になるけど、GTK+を少し触ってみるっていうのが本記事
###利用環境
CentOS Linux release 7.7.1908 (Core)
gtk2-devel-2.24.31-1.el7.x86_64
###GTK+のCentOSへのインストール
CentOS でGTK 2 パッケージがインストールされているか確認する方法
rpm -q gtk2
rpm -q gtk2-devel
そこで、gtk2-devel のインストール(yumにて)
yum install gtk2-devel
###ちょんプロ (HELLO SKKS)
#include <gtk/gtk.h>
static void destroy(GtkWidget *window, gpointer data)
{
/* メインループを終了 */
gtk_main_quit();
}
int main(int argc, char *argv[])
{
GtkWidget *window, *label;
/* GTK+ の初期化 */
gtk_init(&argc, &argv);
/* ウィンドウ(GtkWindow) の作成 */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* ウィンドウの初期設定 */
gtk_window_set_title(GTK_WINDOW(window), "SKKS"); // title
gtk_widget_set_size_request(window, 200, 100); // window size
/* ウィンドウが消去されたときのコールバック関数を設定 */
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(destroy), NULL);
/* ラベル(GtkLabel) の作成 */
label = gtk_label_new("Hello, SKKS!");
/* ラベルをウィンドウに追加 */
gtk_container_add(GTK_CONTAINER(window), label);
/* ウィンドウを表示 */
gtk_widget_show_all(window);
/* メインループ */
gtk_main();
return 0;
}
###コンパイル
gcc -Wall -o hello HelloGTK2.c `pkg-config --cflags --libs gtk+-2.0`
Linux畑の人には常識かも知れませんが、調べたのでメモ
シェルスクリプトの中で,コマンドを `(グレイヴアクセント,アクサングラベ,shft+@)で括ると,その部分がそのコマンドの実行結果で置き換わる.
つまり、gtk+2.0に必要な、 -I や -L などをpkg-configコマンドで生み出している
では、pkg-configとは?
以下はWikipediaより
pkg-configは、環境変数PKG_CONFIG_PATHのパスに存在する *.pc ファイルに記録された情報を元に、ビルドの際に必要な文字列を返す。
例えば、libaaa.soを /usr/local/lib/aaa/ 以下に保存し、ヘッダファイルを /usr/local/include/aaa/ 以下にインストールした場合
libaaa.so を利用したソースをコンパイルする際に、コンパイラへlibとincludeのパス等を指定する必要があるが、
そのパスが環境ごとに異なる場合を考えると必ずしも gcc -I/usr/local/lib/include -o a.c -L/usr/local/lib/aaa -laaa が成立するとは限らない。
もしもlibaaa が aaa.pc を提供していれば、
pkg-config aaa --cflags
で文字列 -I /usr/local/lib/aaa を得られ、
pkg-config aaa --libs
で文字列 -L /usr/local/lib/aaa -laaa を得られる