12月16日に GTK 4.0 が公開をされました。GTK は C 言語で記述されたクロスプラットフォーム対応の GUI ツールキットです。最近は GTK を使って直接コンパイルすることをしなくなってしまいましたが、いまどきの GTK を知りたくなり、簡単なプログラムをコンパイルしてみました。
本ブログ記事では下記の OS 環境で動作確認をしています。
Fedora 33 (Workstation Edition) | x86_64 |
GTK4 のパッケージをインストール
dnf コマンドで gtk4 を検索キーにしてパッケージを検索すると下記のように該当パッケージ一覧が表示されます。
[bitwalk@fedora-pc ~]$ dnf search gtk4
...
============================= 名前 完全一致: gtk4 ==============================
gtk4.i686 : GTK graphical user interface library
gtk4.x86_64 : GTK graphical user interface library
=============================== 名前 一致: gtk4 ================================
gtk4-devel.i686 : Development files for GTK
gtk4-devel.x86_64 : Development files for GTK
libproxy-webkitgtk4.x86_64 : Plugin for libproxy and webkitgtk3
[bitwalk@fedora-pc ~]$
バージョンを確認すると 3.99.4 で、さすがにまだ 4.0 になっていませんでしたが、ほぼ同等と考えてインストールすることにしました。GTK のマイナーバージョンの番号が .90 以降は、次のメジャーバージョンへの開発バージョンという扱いになります [3]。
[bitwalk@fedora-pc ~]$ dnf list gtk4 ... 利用可能なパッケージ gtk4.i686 3.99.4-1.fc33 updates gtk4.x86_64 3.99.4-1.fc33 updates [bitwalk@fedora-pc ~]$
下記のようにインストールしました。
[bitwalk@fedora-pc ~]$ sudo dnf install gtk4-devel ... 依存関係が解決しました。 ================================================================================ パッケージ Arch バージョン リポジトリー サイズ ================================================================================ インストール: gtk4-devel x86_64 3.99.4-1.fc33 updates 12 M 依存関係のインストール: graphene-devel x86_64 1.10.2-4.fc33 fedora 157 k gtk4 x86_64 3.99.4-1.fc33 updates 4.8 M トランザクションの概要 ================================================================================ インストール 3 パッケージ ダウンロードサイズの合計: 17 M インストール後のサイズ: 62 M これでよろしいですか? [y/N]: y パッケージのダウンロード: (1/3): graphene-devel-1.10.2-4.fc33.x86_64.rpm 915 kB/s | 157 kB 00:00 (2/3): gtk4-3.99.4-1.fc33.x86_64.rpm 10 MB/s | 4.8 MB 00:00 (3/3): gtk4-devel-3.99.4-1.fc33.x86_64.rpm 1.9 MB/s | 12 MB 00:06 -------------------------------------------------------------------------------- 合計 2.1 MB/s | 17 MB 00:07 ... (途中省略) ... 完了しました! [bitwalk@fedora-pc ~]$
なお、GTK を利用したプログラムをコンパイルするにあたって、C コンパイラ (gcc) がインストールされていることを前提にしています。
Hello World プログラムをコンパイル
GTK プロジェクトの下記サイトに紹介されている Hello World のプログラムをビルドします。
念の為、下記にソースコード表示しました。なお、astyle で整形しています。
hello-world-gtk.c について
hello-world-gtk.c は以下の構成になっています。
- main() 関数
- main() 関数で GtkApplication のインスタンスが作成され、gtk_application_new() を使って初期化されます。
- activate シグナルを main() 関数の上にある activate() 関数に接続します。
- g_application_run 内で activate() 関数へシグナルが送信され、アプリケーションの activate() 関数に進みます。
- activate() 関数
- gtk_application_window_new() 関数は新しい GtkApplicationWindow インスタンスを作成します。
- gtk_window_set_title() 関数を使ってウィンドウのタイトルを設定します。ただし GTK_WINDOW() マクロを使ってウィンドウをキャストしなければなりません。
- gtk_window_set_default_size() 関数でウィンドウのサイズを設定します。
- ボタンの追加
- gtk_button_new_with_label() 関数でボタンを初期化します。
- g_signal_connect を使って、print_hello() 関数に接続し、ボタンがクリックされると GTK がこの関数を呼び出すようにしています。
- print_hello() 関数
- "Hello World" という文字列を引数にして g_print() 函数を呼び出します。
- gtk_window_set_child() 関数でボタンをウィンドウに追加します。
- gtk_window_present() 関数でウィンドウを表示します。
- ウィンドウ右上の X をクリックするなどしてウィンドウを終了すると、g_application_run() 関数は status に保存された数値を返します。
- その後、GtkApplication オブジェクトは g_object_unref() 関数によってメモリから解放されます。
- 最後に status の整数値が OS に返され、GTK アプリケーションは終了します。
pkgconf
上記 Getting Started では、Hello World のプログラムをコンパイル(ビルド)する際に pkg-config を利用しています。pkg-config は、使用するライブラリのビルドに必要な情報が記載された .pc ファイルを読み込んで、ビルドに必要な文字列を返すプログラムです。
Fedora を含む Red Hat 系の OS では、オリジナルの pkg-config ではなく、pkgconf [4] を採用しています。pkg-config というコマンド名、コマンドレベルでの操作、コマンドの実行結果はどちらも同じです。
下記のように backticks(バッククォート)` で囲んで pkg-config のコマンドを実行します。
$ gcc `pkg-config aaa --cflags --libs` aaa.c
コンパイル
上記 Getting Started に従って、下記のようにコンパイルします。
[bitwalk@fedora-pc hello-world-gtk]$ gcc -o hello-world-gtk hello-world-gtk.c `pkg-config --cflags --libs gtk4` 次のファイルから読み込み: /usr/include/gtk-4.0/gdk/gdk.h:76, 次から読み込み: /usr/include/gtk-4.0/gtk/gtk.h:31, 次から読み込み: hello-world-gtk.c:1: /usr/include/gtk-4.0/gdk/gdkvulkancontext.h:32:10: 致命的エラー: vulkan/vulkan.h: そのようなファイルやディレクトリはありません 32 | #include <vulkan/vulkan.h> | ^~~~~~~~~~~~~~~~~ コンパイルを停止しました。 [bitwalk@fedora-pc hello-world-gtk]$
「vulkan/vulkan.h: そのようなファイルやディレクトリはありません」というエラーが出たので、不足分をインストールします。
[bitwalk@fedora-pc hello-world-gtk]$ sudo dnf install vulkan-headers ... ================================================================================ パッケージ Arch バージョン リポジトリー サイズ ================================================================================ インストール: vulkan-headers noarch 1.2.148.0-1.fc33 fedora 532 k トランザクションの概要 ================================================================================ インストール 1 パッケージ ダウンロードサイズの合計: 532 k インストール後のサイズ: 8.2 M これでよろしいですか? [y/N]: y パッケージのダウンロード: ... (途中省略) ... 完了しました! [bitwalk@fedora-pc hello-world-gtk]$
再びコンパイルします。
[bitwalk@fedora-pc hello-world-gtk]$ gcc -o hello-world-gtk hello-world-gtk.c `pkg-config --cflags --libs gtk4` [bitwalk@fedora-pc hello-world-gtk]$ ls hello-world-gtk hello-world-gtk.c [bitwalk@fedora-pc hello-world-gtk]$ ./hello-world-gtk Hello World [bitwalk@fedora-pc hello-world-gtk]$
この Hello World プログラムをビルドした限りでは、従来の GTK との違いが全く判りません。GTK 4.0 がリリースされたのを機会に簡単なサンプルを試してみる予定です。
参考サイト
- GTK 4.0 – GTK Development Blog [2020-12-16]
- 「GTK 4」が公開、メディア再生サポートなどが加わる | OSDN Magazine [2020-12-17]
- Versioning and long term stability promise in GTK+ – GTK Development Blog [2016-09-01]
- pkgconf/pkgconf: package compiler and linker metadata toolkit
にほんブログ村
0 件のコメント:
コメントを投稿