GTK+中文社区(gtk.awaysoft.com)

 找回密码
 马上加入

QQ登录

只需一步,快速开始

查看: 3470|回复: 3

1.4 GTK+ 程序的編譯與運行

[复制链接]
  • TA的每日心情
    慵懒
    2013-7-6 15:08
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]初来乍到

    发表于 2013-7-5 17:52:05 | 显示全部楼层 |阅读模式
    本帖最后由 ekd123 于 2013-7-5 18:28 编辑

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

    編譯GTK+程序
    編譯GTK+程序,你需要告訴編譯器在哪裏找到GTK+的頭文件和庫文件,這個功能由pkg-config完成。當然,UNIX系統下大多數庫都有pkg-config的支持。
    編譯器旗標:
    1. [mike@laptop-mike ~]$ pkg-config --cflags gtk+-3.0
    2. -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  
    复制代码
    連接庫選項:
    1. [mike@laptop-mike ~]$ pkg-config --libs gtk+-3.0
    2. -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  
    复制代码
    要編譯一個程序,有一個簡單的辦法,直接把這些輸出傳遞給編譯器:
    1. 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):
    1. G_APPLICATION_FLAGS_NONE
    2. // 默認行爲
    3. G_APPLICATION_IS_SERVICE
    4. // 第二次的啓動會直接失敗。程序將停10秒等激活消息的到達。
    5. G_APPLICATION_IS_LAUNCHER
    6. // 不成爲主實例。
    7. G_APPLICATION_HANDLES_OPEN
    8. // (在主實例中)處理文件。僅影響默認的 local_command_line 實現,
    9. // 當傳遞 G_APPLICATION_HANDLES_COMMAND_LINE 時無效。
    10. // 詳情參考g_application_run() 文檔。
    11. G_APPLICATION_HANDLES_COMMAND_LINE
    12. // (在主實例中)處理命令行參數。
    13. // 僅影響默認的 local_command_line 實現。
    14. // 詳情參考g_application_run()文檔。
    15. G_APPLICATION_SEND_ENVIRONMENT
    16. // 將啓動進程的環境發送給主實例。
    17. // 若程序行爲因不同的環境變量而變,就設置此旗標。
    18. // 環境變量可通過g_application_command_line_getenv()在 command_line 信號處理器中獲得。
    19. G_APPLICATION_NON_UNIQUE
    20. // 就算程序ID給出也不嘗試單例協商。程序不成爲ID的擁有者,也不檢查是否已有擁有者。
    21. // 所有事情在本地進程中發生。
    复制代码
    按:實際上 GtkApplication 是 GApplication 的一個子類。大部分功能由 GApplication 提供,GtkApplication 僅提供和圖形界面有關的一些功能。

    開始運行:

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


    答疑解惑
    1. 問:實例是什麼?
    2. 答:假設現在有一個程序,你打開之後,這個進程就叫做這個程序的實例(instance)。實例並不一定有一個。比如你打開 gedit 兩次,兩個 gedit 進程都是 gedit 程序的實例。
    复制代码
    1. 問:程序 ID 是什麼?
    2. 答:程序 ID 即 gtk_application_new 的第一個參數,同時代指 DBus 接口。
    复制代码
    1. 問:主實例是什麼?
    2. 答:GtkApplication 將程序 ID 的擁有者(其實是一個實例)稱爲主實例(primary instance)。
    复制代码
    1. 問:GtkApplication 正確的使用方法是什麼?
    2. 答:雖然在 <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 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    *滑块验证:
    您需要登录后才可以回帖 登录 | 马上加入

    本版积分规则

    申请友链|Archiver|小黑屋|手机版|GTK+中文社区 ( 粤ICP备13080851号 )

    我要啦免费统计

    GMT+8, 2024-4-17 02:00 , Processed in 0.065084 second(s), 12 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表