ekd123 发表于 2013-7-5 17:52:05

1.4 GTK+ 程序的編譯與運行

本帖最后由 ekd123 于 2013-7-5 18:28 编辑

撰文:Mike Manilone <crtmike在gmx點us>

編譯GTK+程序
編譯GTK+程序,你需要告訴編譯器在哪裏找到GTK+的頭文件和庫文件,這個功能由pkg-config完成。當然,UNIX系統下大多數庫都有pkg-config的支持。
編譯器旗標:$ pkg-config --cflags gtk+-3.0
-pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng15 -I/usr/include/libdrm
連接庫選項:$ pkg-config --libs gtk+-3.0
-lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0
要編譯一個程序,有一個簡單的辦法,直接把這些輸出傳遞給編譯器:cc FOO.c `pkg-config --cflags --libs gtk+-3.0` -o FOO
這裏使用了shell的一個小技巧,使用 ` (反引號)就相當於將 「pkg-config --cflags --libs gtk+-3.0」 的輸出整個寫在了這裏。
當編譯器無錯進行完畢後,你的成品就出現了!

怎樣運行GTK+程序?
GTK+ 的文檔中有詳細的闡釋,在此不作贅述。【中文翻譯】

運行GTK+程序時發生了什麼?【GtkApplication 類的詳細解釋】
在 1.3 Hello World! 節中,我們寫了一個比較規範的 GTK+ 3 Hello World,當然不規範的話更簡單了。我們現在詳細解釋一下 GtkApplication 類。
GtkApplication 類是一個包裝了「應用程序」的類。這話聽起來很抽象,簡單說,就是提供了一些應用程序中常見的輪子,如單例、同程序不同實例間的通信等。另外,GtkApplication 提供了 AppMenu 的支持(在 2.10 節中討論)。這些都基於 GIO 中的 DBus 支持。至於 DBus,本套 GTK+ 教程中不會涉及。

準備階段:
創建一個應用程序實例,即調用 gtk_application_new,此函數會自動調用 gtk_init。(gtk_init 是 GTK+ 的初始化。)
接着,GtkApplication 會自動創建一個 DBus 接口,該接口的行爲由 gtk_application_new 第二個參數——旗標——決定。GTK+ 中大部分旗標都是通過 「|」 來使用的。可供選用的旗標有(截至 GTK+ 3.8):G_APPLICATION_FLAGS_NONE
// 默認行爲
G_APPLICATION_IS_SERVICE
// 第二次的啓動會直接失敗。程序將停10秒等激活消息的到達。
G_APPLICATION_IS_LAUNCHER
// 不成爲主實例。
G_APPLICATION_HANDLES_OPEN
// (在主實例中)處理文件。僅影響默認的 local_command_line 實現,
// 當傳遞 G_APPLICATION_HANDLES_COMMAND_LINE 時無效。
// 詳情參考g_application_run() 文檔。
G_APPLICATION_HANDLES_COMMAND_LINE
// (在主實例中)處理命令行參數。
// 僅影響默認的 local_command_line 實現。
// 詳情參考g_application_run()文檔。
G_APPLICATION_SEND_ENVIRONMENT
// 將啓動進程的環境發送給主實例。
// 若程序行爲因不同的環境變量而變,就設置此旗標。
// 環境變量可通過g_application_command_line_getenv()在 command_line 信號處理器中獲得。
G_APPLICATION_NON_UNIQUE
// 就算程序ID給出也不嘗試單例協商。程序不成爲ID的擁有者,也不檢查是否已有擁有者。
// 所有事情在本地進程中發生。
按:實際上 GtkApplication 是 GApplication 的一個子類。大部分功能由 GApplication 提供,GtkApplication 僅提供和圖形界面有關的一些功能。

開始運行:
GtkApplication 自身會調用 local_command_line 虛函數(可以用它來替代 main 函數)。調用 g_application_activate 會在主實例上發射一個 activate 信號。如果有 COMMAND LINE 旗標,在主實例上會發射一個 command-line 信號。如果有 OPEN 旗標,會在主實例上發射一個 open 信號。


答疑解惑問:實例是什麼?
答:假設現在有一個程序,你打開之後,這個進程就叫做這個程序的實例(instance)。實例並不一定有一個。比如你打開 gedit 兩次,兩個 gedit 進程都是 gedit 程序的實例。
問:程序 ID 是什麼?
答:程序 ID 即 gtk_application_new 的第一個參數,同時代指 DBus 接口。
問:主實例是什麼?
答:GtkApplication 將程序 ID 的擁有者(其實是一個實例)稱爲主實例(primary instance)。
問:GtkApplication 正確的使用方法是什麼?
答:雖然在 <a href="http://gtk.awaysoft.com/read-588-1.html">1.3 Hello World!</a> 節中我們是直接使用了 GtkApplication 的 API,但實際工程一般都會定義定義一個自己的類。於是 main 就被架空了。

ovip520o 发表于 2015-4-8 09:17:59

ovip520o 发表于 2015-4-8 09:35:23

liutongju 发表于 2015-4-12 21:22:42

顶起~~~~~~~~~
页: [1]
查看完整版本: 1.4 GTK+ 程序的編譯與運行