大家一起用gtk編程_第1頁
大家一起用gtk編程_第2頁
大家一起用gtk編程_第3頁
大家一起用gtk編程_第4頁
大家一起用gtk編程_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、大家一起用gtk編程1(開始與熱身)· 寫在最前面筆者寫做本文的目的,主要是為初學(xué)GTK編程的新手們提供一個能夠快速上手的學(xué)習(xí)檔案,能夠通過自己將所有的代碼輸入并編譯,以達(dá)到學(xué)習(xí)的目的。同時,也希望它成為一個參考手冊,希望GTK中的每一個API都能在本文中找到相應(yīng)的示例。筆者將盡力保證所有的代碼都是最短小的,這樣才能保證大家都有足夠的動力去手工輸入它。由于筆者時間及精力有限,不能一次將所有內(nèi)容呈現(xiàn)給所有讀者,因此擬定了一個計(jì)劃:每天更新一個章節(jié)的內(nèi)容,在筆者的Blog上進(jìn)行連載,同時會不斷地對以前的內(nèi)容進(jìn)行修改和完善,因此為了保證大家能夠讀到最新的內(nèi)容,請隨時關(guān)注筆者的Blog:&#

2、183; 為什么是GTK?為什么不是GTK?筆者不想花費(fèi)太多的口水去辨證為什么選擇GTK而不是其它的東西;任何技術(shù)都沒有好壞之分,只有使用它的人有能力的強(qiáng)弱之別;筆者認(rèn)為比較明智的做法是:多編些程序,少做些爭論。· 1、GTK簡介GTK (GIMP Toolkit) 是一套用于創(chuàng)建圖形用戶界面的工具包。它遵循 LGPL 許可證,所以可以用它來開發(fā)開源軟件、自由軟件,甚至是封閉源代碼的商業(yè)軟件,而不用花費(fèi)任何費(fèi)用來購買許可證和使用權(quán)。當(dāng)前,GTK已經(jīng)被成功地應(yīng)用到了大量的自由軟件及商業(yè)軟件中,已經(jīng)取得了很大的成功。GTK 的創(chuàng)建者:    Peter Ma

3、ttis:     Spencer Kimball:     Josh MacDonald: 當(dāng)前,GTK主要由幾大組件構(gòu)成:*Gtk+:GTK的主要構(gòu)件,包括所有的圖形控件及大量實(shí)用的API。*Glib:包含一些標(biāo)準(zhǔn)函數(shù)的替代函數(shù),以及一些處理鏈表等數(shù)據(jù)結(jié)構(gòu)的函數(shù)等。這些替代函數(shù)被用來增強(qiáng)GTK 的可移植性,同時提供 libc 的對應(yīng)函數(shù)的增強(qiáng)版本。*Pango:該組件用來處理國際化文字輸出。·

4、2、預(yù)備工欲xxx,必先利其器!在進(jìn)行實(shí)際的程序設(shè)計(jì)之前,應(yīng)該先明確一些主要的開發(fā)工具。1)GTK是跨平臺的,它能夠運(yùn)行于Linux/Unix/Windows/MacOS及嵌入式系統(tǒng),但這不是本文所關(guān)注的重點(diǎn);實(shí)際上,只要按照GTK所提供的API去編程,基本上在一個平臺上設(shè)計(jì)的程序,在其它平臺可以不加任何修改而成功地進(jìn)行編譯。筆者使用的操作系統(tǒng)是:Dubuntu-6.06,本文中所有的示例代碼將在該平臺上進(jìn)行開發(fā)并編譯運(yùn)行;當(dāng)然,這并不代表不能使用其它操作系統(tǒng),只要安裝了GCC編譯環(huán)境、GTK/Glib/Libc開發(fā)庫,基本上就能成功地編譯運(yùn)行本文中的所有示例,現(xiàn)就Ubuntu Dapper

5、發(fā)行版GTK開發(fā)環(huán)境安裝方法簡述如下:sudo apt-get install vim                        #是的,筆者使用vim來編寫代碼,當(dāng)然您可以使用任何自己喜歡的編輯器sudo apt-get install build-essential       #這將安裝sudo g

6、cc/g+/gdb/make 等基本編程工具sudo apt-get install gnome-core-devel  #這將安裝 libgtk2.0-dev libglib2.0-dev 等開發(fā)相關(guān)的庫文件sudo apt-get install pkg-config            #用于在編譯GTK程序時自動找出頭文件及庫文件位置sudo apt-get install devhelp      

7、60;          #這將安裝 devhelp GTK文檔查看程序sudo apt-get install libglib2.0-doc libgtk2.0-doc                            &#

8、160;                       #這將安裝 gtk/glib 的API參考手冊及其它幫助文檔sudo apt-get instal glade libglade2-dev #這將安裝基于GTK的界面構(gòu)造程序當(dāng)然,其它的 Linux 發(fā)行版可參考相應(yīng)的文檔進(jìn)行開發(fā)環(huán)境的搭建,各大Linux論壇是個不錯的咨詢地: , www.l

9、如果有熱心的同仁能提供其它操作系統(tǒng) GTK 開發(fā)庫的安裝方法,歡迎提供給我筆者,筆者將在這里分享給大家!先行謝過了。· 3、Hello,Dubuntu!嗯,早就急不可待了,讓我們開始我們的第一個程序吧!本程序的主要功能: 顯示一個窗口,并在窗口的標(biāo)題欄顯示字符串"Hello, Dubuntu!"源代碼如下所示,編譯成功后,可以通過命令行輸入 ./hello_dubuntu 來運(yùn)行此程序,顯示效果如下:hello_dubuntu.c #include<gtk/gtk.h>/* 一般可以在 /usr/include/gtk

10、-2.0 下找到上邊的頭文件 * 上邊的頭文件的作用是包含進(jìn)行GTK編程所有可能用到的頭 * 文件,包括glib.h等 */int main(int argc, char *argv)        GtkWidget *window;        / GtkWidget 是絕大部分可視組件的的基類        gtk_init(&argc, &

11、amp;argv);        /對程序傳入的命令行參數(shù)進(jìn)行標(biāo)準(zhǔn)化處理        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);        /創(chuàng)建窗口(200x200大小)        gtk_window_set_title(GTK_WINDOW(window

12、), "Hello,Dubuntu!");        /設(shè)置窗口標(biāo)題        gtk_widget_show(window);        /顯示窗口        gtk_main();        /Gtk程序主

13、循環(huán)        return 0; 編譯程序: gcc hello_dubuntu.c -o hello_dubuntu pkg-config -cflags -libs gtk+-2.0  # 注意:"" 不是普通的單引號 "'",而是同""在一起的那個符號!是的,上邊的程序非常簡單,除了注釋就沒幾條語句了!但它確實(shí)是一個GTK程序,雖然它還不夠完善,缺少信號處理,因此當(dāng)您單擊“關(guān)閉”按鈕關(guān)閉此窗口后,實(shí)際上程序還在運(yùn)行。1) 編譯

14、程序的命令行:如上,使用GNU C語言編譯器 gcc , 其中 pkg-config -cflags -libs gtk+-2.0 用于生成 gcc 編譯及鏈接程序時所必須的頭文件及庫文件列表,在筆者的機(jī)器上運(yùn)行該命令得到的結(jié)果如下:命令: pkg-config -cflags -libs gtk+-2.0輸出:-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0

15、-I/usr/lib/glib-2.0/include  -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXfixes -lpango-1.0 -lcairo -lX11 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0 2) 大家如果對某個GTK標(biāo)準(zhǔn)API定義,或者某個類型/常量定義不清楚,可以在 devhel

16、p 幫助程序中進(jìn)行搜索,以查看某參數(shù)說明。3) gtk_init(&argc, &argv) 函數(shù)用于對傳入進(jìn)來的標(biāo)準(zhǔn)命令行參數(shù)進(jìn)行解析并處理,這些標(biāo)準(zhǔn)命令行參數(shù)為(即:運(yùn)行我們的程序時,通過命令行傳入的下列參數(shù)會被自動處理):· -gtk-module · -g-fatal-warnings · -gtk-debug · -gtk-no-debug · -gdk-debug · -gdk-no-debug · -display · -sync · -name · -class4

17、) gtk_widget_show(window) 用于告訴程序, 我們的 window 構(gòu)件已經(jīng)準(zhǔn)備完成,可以顯示了。5) gtk_main() ,程序?qū)\(yùn)行到此,然后等待“事件”的發(fā)生;當(dāng)有事件發(fā)生后,將調(diào)用此事件對應(yīng)的回調(diào)函數(shù),當(dāng)回調(diào)函數(shù)執(zhí)行完畢,又會重新回到 gtk_main() ,等待新的“事件”發(fā)生。6) 宏 GTK_WINDOW(window) 是用于進(jìn)行類型檢查及轉(zhuǎn)換,它將把一個可以轉(zhuǎn)化為 GtkWindow 的構(gòu)件強(qiáng)制轉(zhuǎn)換為GtkWindow 類型后傳遞給函數(shù)。好了,hello_dubuntu.c 理解了嗎? 什么!沒有理解! 不要緊,我們下邊還會有很多這樣的小例子,再多輸

18、入幾個就會理解了,相信我!下集預(yù)告:將在窗口中添加一個按鈕,并為按鈕關(guān)聯(lián)"clicked"事件,以使單擊按鈕后會有一些返回。大家一起用gtk編程2(添加按鈕和連接事件)· 4、加入按鈕和事件處理函數(shù)上回說道,咱們使用GTK創(chuàng)建了一個最簡單的GTK程序,簡單到只能顯示一個200x200點(diǎn)大小的空白窗口,并在標(biāo)題欄顯示“Hello,Dubuntu!”的字樣! 雖然簡單,但確實(shí)是個不錯的開端,好了,咱們現(xiàn)在在窗口中添加一個按鈕。運(yùn)行效果:代碼:hello_dubuntu2.c /* 本例的主要目的是在窗口中顯示一個按鈕, * 并且單擊按鈕退出程序&#

19、160;*/#include<gtk/gtk.h>voidcb_button(GtkWidget *widget, gpointer data)/ 按鈕"button"的回調(diào)函數(shù)        gtk_main_quit();intmain(int argc, char *argv)        GtkWidget *main_window; /主窗口對象     

20、0;  GtkWidget *button;              /將要放置到主窗口中的按鈕對象        gtk_init(&argc, &argv);        main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  

21、      gtk_window_set_title(GTK_WINDOW(main_window), "Hello,Dubuntu2!");        /設(shè)置窗口的默認(rèn)大?。▽?00,高度50)        gtk_window_set_default_size(GTK_WINDOW(main_window), 200,50);    &#

22、160;   button = gtk_button_new_with_label("退出程序");        gtk_container_add(GTK_CONTAINER(main_window), button);        /為"button"連接“單擊事件”要調(diào)用的回調(diào)函數(shù)       g_signal_con

23、nect(G_OBJECT(button),"clicked",G_CALLBACK(cb_button),NULL);        gtk_widget_show(button);        gtk_widget_show(main_window);        /上邊的兩句可以合為 gtk_widget_show_all(window) 

24、0;      gtk_main();        return 0; 編譯: gcc -o hello_dubuntu2  hello_dubuntu2.c  pkg-config -cflags -libs gtk+-2.0程序注釋:1)在GTK中,默認(rèn)添加到窗口中的控件會自動占滿所有的空間,因此當(dāng)我們的程序運(yùn)行時,將窗口放大時按鈕也跟著放大了;這點(diǎn)同Windows及Qt是不相同的。正因?yàn)槿绱耍贕TK控件庫中有幾個控件專門用來進(jìn)行窗口布局

25、,比如說vbox, hbox, table, GtkPixed 等, 通過對它們的靈活操作,可以得到一個非常漂亮的應(yīng)用程序界面!這將在以后進(jìn)行詳細(xì)介紹。2)關(guān)于事件與回調(diào)函數(shù)事件:GTK同許多其它的圖形編程庫相似,都采用事件驅(qū)動方式來工作,這就關(guān)系到出現(xiàn)什么事件做什么工作的問題。(在GTK中還有個“信號”的概念,同“事件”的概念不容易分清楚,特別是剛開始學(xué)習(xí)時,不過沒關(guān)系,初期我們就把它們當(dāng)一個概念來理解),在GTK2.0中,一般使用 g_signal_connect() 函數(shù)來注冊每個對象和其對應(yīng)的處理函數(shù),如本例所示?;卣{(diào)函數(shù):實(shí)際上就是一個普通的函數(shù),不過它并不會被顯示地直接調(diào)用,而是把

26、它的地址注冊到另一個函數(shù),在那個函數(shù)中間接地對它進(jìn)行調(diào)用,這也是回調(diào)的由來。3)在本例中,我們通過下列語句為“button”注冊了一個"clicked"事件的回調(diào)函數(shù)“cb_button",前綴”cb“即”call back(回調(diào))”的意思。g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button),NULL); 由于注冊了上邊的回調(diào)函數(shù),因此當(dāng)我們用鼠標(biāo)單擊按鈕時,就會激發(fā)按鈕的“clicked”事件,因此會調(diào)用 cb_button() 函數(shù),而此函數(shù)中的語句

27、0; gtk_main_quit() 的作用是退出程序,因此我們單擊按鈕后整個程序就會退出。4)當(dāng)然,這個程序還有個小“bug”,即直接單擊右上角的“關(guān)閉按鈕”關(guān)閉程序后,雖然主窗口消失了,但程序并沒有直接地退出,還駐留在內(nèi)存中。 這是因?yàn)楫?dāng)單擊右上角的“關(guān)閉按鈕”關(guān)閉程序后,會產(chǎn)生“destroy”信號,而我們并沒有為此信號使用 g_signal_connect() 函數(shù)注冊相關(guān)的處理函數(shù),因此它的行為并不是我們所期望的;解決方法就是為主窗口的”destroy"信號注冊一個回調(diào)函數(shù),并在此回調(diào)函數(shù)中調(diào)用 gtk_main_quit() 以便退出程序,將如下代碼添加到hello_du

28、buntu2.c 的 gtk_main() 函數(shù)調(diào)用的上邊就行:g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(cb_button),NULL); 請注意:在這里我們再一次使用了 "cb_button“函數(shù),這是因?yàn)樗男袨檎俏覀兿胍?,即”調(diào)用此回調(diào)函數(shù)后, 退出程序“。好了,今天的內(nèi)容差不多了,很多內(nèi)容都沒有深入研究,不過沒關(guān)系,慢慢來,以后將要以專題的形式對GTK的每個部件及API進(jìn)行深入并細(xì)致的說明。如果您對本例中的一些概念沒有完全理解也沒有關(guān)系,繼續(xù)下一步,很容易理解

29、的!千萬不要呆在原地不動。下回預(yù)告:將簡要說明如何編寫簡單的 Makefile 文件來組織我們的源程序,另外還將介紹如何利用 gdb 對我們的程序進(jìn)行調(diào)試!精彩不容錯過。附:添加”destroy“信號處理后的 hello_dubuntu2.chello_dubuntu2.c /* 本例的主要目的是在窗口中顯示一個按鈕, * 并且單擊按鈕退出程序 */#include<gtk/gtk.h>voidcb_button(GtkWidget *widget, gpointer data)/ 按鈕"button"的回調(diào)函數(shù)  

30、60;     gtk_main_quit();intmain(int argc, char *argv)        GtkWidget *main_window; /主窗口對象        GtkWidget *button;              /將要放置到主窗口中的按鈕對

31、象        gtk_init(&argc, &argv);        main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);        gtk_window_set_title(GTK_WINDOW(main_window), "Hello,Dubuntu2!");  &#

32、160;     /設(shè)置窗口的默認(rèn)大?。▽?00,高度50)        gtk_window_set_default_size(GTK_WINDOW(main_window), 200,50);        button = gtk_button_new_with_label("退出程序");        gtk_con

33、tainer_add(GTK_CONTAINER(main_window), button);        /為"button"連接“單擊事件”要調(diào)用的回調(diào)函數(shù)        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button),NULL);        gtk_

34、widget_show(button);        gtk_widget_show(main_window);        /上邊的兩句可以合為 gtk_widget_show_all(window)        g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(cb_button),N

35、ULL);        gtk_main();        return 0; 編譯: gcc -o hello_dubuntu2  hello_dubuntu2.c  pkg-config -cflags -libs gtk+-2.0大家一起用gtk編程3(初步使用Makefile)· 5、初步使用Makefile上回說道,咱們使用GTK創(chuàng)建了一個能夠截獲事件的GTK程序,本節(jié)將簡單地介紹一下如何使用Makef

36、ile來組織我們的源程序,使用Makefile是基于如下幾個原因:· 能實(shí)現(xiàn)從無限簡單到無窮復(fù)雜的軟件工程組織 · 能方便地與眾多的Linux命令與實(shí)用程序集成,當(dāng)然也包括Vim與emacs · 還有很多,就留給讀者自己探索吧.筆者在這里介紹Makefile的主要目的是想讓大家知道Linux下有這樣一個工具,使用它確實(shí)很方便,并且希望大家在有需要的時候能夠想到它??偟膩碚f,Makefile是使用一系列的依賴關(guān)系和時間值,來決定是否對一個目標(biāo)進(jìn)行重構(gòu)建;不廢話了,來看看我們的Makefile文件長什么樣:Makefile 注意:Makefile 文件如果從網(wǎng)頁上直接

37、拷貝,往往不能成功正常使用,請從下邊的附件中下載可用的文件。CC=gccPROG_NAME=hello_dubuntu2INCS=SRCS=hello_dubuntu2.c#從xx.c 文件得到 xx.o 文件OBJS=$SRCS:.c=.o#編譯GTK程序時要用到的庫LIBS=gtk+-2.0#- 用戶修改區(qū)域 結(jié)束# -O2CFLAGS=pkg-config -cflags $LIBS -g -WallLDFLAGS=pkg-config -libs $LIBS   -g -Wallall: $PROG_NAME$PROG_NAME:$OBJS  &

38、#160;     $CC -o $PROG_NAME $OBJS $LDFLAGS#注意:上邊”$CC" 的前邊有一個TAB鍵,而不是空格#如果有頭文件進(jìn)行修改,則自動編譯源文件$OBJS:$INCS.c.o:        $CC -c $<  $CFLAGSclean:        rm -f *.o  $PROG_NAMErebuild: clean all 編

39、譯:將此Makefile文件與上一節(jié)的 hello_dubuntu2.c 文件放在同一個文件夾下,然后運(yùn)行如下命令即可編譯出 hello_dubuntu2 可執(zhí)行文件:make 程序注釋:1)剛開始的幾行定義了幾個變量,比如用CC來代替真正的 gcc 編譯器,這樣當(dāng)想換別的編譯器來編譯我們的程序時直接改變CC變量的值就OK了。其它的:· CC 指代用來編譯程序的編譯器,這里使用 gcc· RPOG_NAME 指代最終要生成的可執(zhí)行文件名,需手工填入 · INCS 指代工程文件中所自定義的所有頭文件,需手工填入· SRCS 指代所有使用到的源文件,需手工填

40、入 · OBJS 是通過 .c 文件得到的 .o 文件,因?yàn)槊總€ .c 文件都將編譯生成一個對應(yīng)的 .o 文件,自動生成 · LIBS 用來指代編譯GTK程序時需要使用到的GTK相關(guān)庫,一般使用默認(rèn)的 gtk+-2.0 即可,需手工填入 · CFLAGS 用來指代編譯程序時使用到的一些編譯選項(xiàng), -g 表示生成調(diào)試信息以供GDB使用,-Wall表示生成編譯時的警告信息(W表示W(wǎng)arning,all 表示全部) · LDFLAGS 用來指代進(jìn)行程序連接時使用到的一些選項(xiàng)以上這些變量,將在Makefile的剩余部分使用 $xxx 的形式進(jìn)行引用。2)關(guān)于“目

41、標(biāo)”:“依賴關(guān)系”從“all: $PROG_NAME”這一句開始,Makefile就開始使用 目標(biāo):依賴 的關(guān)系來處理真正的程序編譯了;而它們下邊以 TAB 鍵開始的行就是滿足依賴關(guān)系后要運(yùn)行的程序(注意:是TAB鍵,不是空格)。具體筆者就不詳細(xì)描述了,有興趣的讀者可以參考下邊推薦的教程。3)關(guān)于 “.c.o:” 語句:這句話的意思就是說,當(dāng)遇到一個 .c 文件,那么使用它下邊的命令“         $CC -c $<  $CFLAGS” 將 .c 文件編譯為 .o 文件;命令中 $< 用來代替對應(yīng)的

42、 .c 文件的文件名。4)關(guān)于"clean" 和 "rebuild":這兩個者偽目標(biāo),必須使用 "make clean" 或 "make rebuild" 來引用,"make clean" 用于刪除生成的 .o 目標(biāo)文件和可執(zhí)行文件; "make rebuild" 用于對整個工程進(jìn)行重構(gòu)建。5)小技巧:在Vim中,先按 ESC 鍵回到命令模式,再按 ":make" 命令即可對Makefile工程進(jìn)行編譯,如果有編譯錯誤,那么Vim會自動定位到產(chǎn)生錯誤的源程

43、序所對應(yīng)的代碼行,非常利于程序的修改,使用命令":cn" 和 "cp" 還可以定位到“下一個錯誤”與“上一個錯誤”。當(dāng)然,更高級的用法是,使用 autoconf, automake 等工具來自動生成一個符合GNU標(biāo)準(zhǔn)的工程,然后通過它們來自動生成 Makefile 文件,這樣做更佳方便快捷,自動化程度更高,并且能夠使程序更具有可移值性,本文將在后續(xù)章節(jié)開辟專門一節(jié)來進(jìn)行詳細(xì)描述。最后,推薦一篇好教程:跟我一起寫Makefile大家一起用gtk編程4(使用GDB調(diào)試程序)· 6、使用GDB調(diào)試程序 上回話說使用Makefile來組織源代碼,這回簡

44、單地介紹下如何使用GDB來調(diào)試我們的程序;關(guān)于GDB的其它應(yīng)用將在后續(xù)的章節(jié)中逐漸深入。首 先需要肯定一點(diǎn),GDB是個功能異常強(qiáng)大的調(diào)試工具,其本身只能運(yùn)行于字符模式,但是當(dāng)前眾多基于GUI的調(diào)試器/IDE,無論是自由軟件還是商業(yè)軟件, 絕大多數(shù)都使用GDB作為其后端(但這些基于GUI的調(diào)試器都不太穩(wěn)定),因此GDB是個不二的選擇(筆者推薦的GUI調(diào)試器:insight和 ddd)。這里使用 hello_gdb.c 作為例子,如果你從前面一直看過來,對這個程序一定不會陌生,hello_gdb.c 主要在 hello_dubuntu2.c 的基礎(chǔ)上,添加了幾個整型和字符串型變量,來演示gdb的一

45、些基本功能:運(yùn)行效果圖:hello_gdb.c /* 本例的主要目的是在窗口中顯示一個按鈕,* 單擊按鈕退出程序,并構(gòu)建幾個變量來演示GDB功能。*/#include<gtk/gtk.h>voidcb_button(GtkWidget *widget, gpointer data)/ 按鈕"button"的回調(diào)函數(shù)        gint i=5;        gint j=+i;   

46、60;    gtk_main_quit();/此函數(shù)用于演示GDB直接調(diào)用被調(diào)試程序的函數(shù)gintgdb_test(gint arg)        g_print("arg=%dn",arg);        arg+;        return arg;intmain(int argc, char *argv) 

47、0;      GtkWidget *main_window; /主窗口對象        GtkWidget *button;              /將要放置到主窗口中的按鈕對象        /構(gòu)造兩個變量用于演示GDB功能    

48、;    gint a=5;        gchar *name="Dubuntu-6.06"        /        gtk_init(&argc, &argv);        main_window = gtk_window_new(GT

49、K_WINDOW_TOPLEVEL);        gtk_window_set_title(GTK_WINDOW(main_window), "Hello,Dubuntu2!");        /設(shè)置窗口的默認(rèn)大?。▽?00,高度50)        gtk_window_set_default_size(GTK_WINDOW(main_window), 200

50、,50);        button = gtk_button_new_with_label("退出程序");        gtk_container_add(GTK_CONTAINER(main_window), button);        /為"button"連接“單擊事件”要調(diào)用的回調(diào)函數(shù)    

51、;    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button),NULL);        gtk_widget_show(button);        gtk_widget_show(main_window);        /上邊的兩句可以合為 gtk

52、_widget_show_all(window)        g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(cb_button),NULL);        gtk_main();        return 0;編譯: gcc -g -Wall -o hello_gdb hello_gd

53、b.c pkg-config -cflags -libs gtk+-2.0注意:-g 參數(shù)用于為可執(zhí)行文件生成調(diào)試信息;         -Wall 用于在編譯程序時打印所有的警告信息好了,程序就是上邊這個(hello_gdb.c),我們使用如下的命令對它進(jìn)行編譯:gcc -g -Wall -o hello_gdb hello_gdb.c pkg-config -cflags -libs gtk+-2.0編譯完后,如果沒有錯誤,將生成 hello_gdb 可執(zhí)行文件,此可執(zhí)行文件將攜帶 gdb 調(diào)試時所需要的調(diào)試信

54、息,有了這些調(diào)試消息,我們就可以在調(diào)試程序的時候查看函數(shù)名,變量名,源代碼。好了,開始調(diào)試吧:1)在命令行下,通過如下命令加載剛編譯生成的 hello_gdb 程序:gdb ./hello_gdb加載成功后,將得到如下提示信息,并進(jìn)入 gdb 的命令行模式:dubuntudubuntu:/Desktop/gnome-gtk-prog/hello_gtk/src$ gdb ./hello_gdbGNU gdb 0060605-cvsCopyright (C) 2006 Free Software Foundation, Inc.GDB is free software, cove

55、red by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i686

56、-pc-linux-gnu".Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".(gdb)2)好,現(xiàn)在已經(jīng)成功啟動gdb并且加載了可執(zhí)行程序 hello_gdb,接下來的命令絕大部分都是爭對 hello_gdb 程序,下面將列舉幾個最常用的命令:小技巧:在gdb命令中,只需要輸入命令或參數(shù)的前幾個字符,再按鍵盤上的“TAB”鍵,那gdb將自動補(bǔ)齊命令或參數(shù),如果有多個候選者,那么gdb將把它們都列舉出來。· list :簡記為 l ,其作用就是列出程序的源代碼,默

57、認(rèn)每次顯示10行。 · list 行號:將顯示當(dāng)前文件以“行號”為中心的前后10行代碼,如:list 12 · list 函數(shù)名:將顯示“函數(shù)名”所在函數(shù)的源代碼,如:list main · list :不帶參數(shù),將接著上一次 list 命令的,輸出下邊的內(nèi)容。 注意:如果運(yùn)行l(wèi)ist 命令得到類似如下的打印,那是因?yàn)樵诰幾g程序時沒有加入 -g 選項(xiàng):(gdb) list1       ./sysdeps/i386/elf/start.S: No such file or directory. 

58、       in ./sysdeps/i386/elf/start.S· run:簡記為 r ,其作用是運(yùn)行程序,當(dāng)遇到斷點(diǎn)后,程序會在斷點(diǎn)處停止運(yùn)行,等待用戶輸入下一步的命令。 · set args:設(shè)置運(yùn)行程序時的命令行參數(shù),如:set args 33 55 · show args:顯示命令行參數(shù) · continue:簡訊為 c ,其作用是繼續(xù)運(yùn)行被斷點(diǎn)中斷的程序。 · break:為程序設(shè)置斷點(diǎn)。 · break 行號:在當(dāng)前文件的“行號”處設(shè)置斷點(diǎn),如:break

59、 33 · break 函數(shù)名:在用戶定義的函數(shù)“函數(shù)名”處設(shè)置斷點(diǎn),如:break cb_button · info breakpoints:顯示當(dāng)前程序的斷點(diǎn)設(shè)置情況 · disable breakpoints Num:關(guān)閉斷點(diǎn)“Num”,使其無效,其中“Num”為 info breakpoints 中顯示的對應(yīng)值 · enable breakpoints Num:打開斷點(diǎn)“Num”,使其重新生效 · step:簡記為 s ,單步跟蹤程序,當(dāng)遇到函數(shù)調(diào)用時,則進(jìn)入此函數(shù)體(一般只進(jìn)入用戶自定義函數(shù))。 · next:簡記為 n,單

60、步跟蹤程序,當(dāng)遇到函數(shù)調(diào)用時,也不進(jìn)入此函數(shù)體;此命令同 step 的主要區(qū)別是,step 遇到用戶自定義的函數(shù),將步進(jìn)到函數(shù)中去運(yùn)行,而 next 則直接調(diào)用函數(shù),不會進(jìn)入到函數(shù)體內(nèi)。 · until:當(dāng)你厭倦了在一個循環(huán)體內(nèi)單步跟蹤時,這個命令可以運(yùn)行程序直到退出循環(huán)體。 · finish:運(yùn)行程序,直到當(dāng)前函數(shù)完成返回,并打印函數(shù)返回時的堆棧地址和返回值及參數(shù)值等信息。 · stepi或nexti:單步跟蹤一些機(jī)器指令。· print 表達(dá)式:簡記為 p ,其中“表達(dá)式”可以是任何當(dāng)前正在被測試程序的有效表達(dá)式,比如當(dāng)前正在調(diào)試C語言的程序,那么“

61、表達(dá)式”可以是任何C語言的有效表達(dá)式,包括數(shù)字,變量甚至是函數(shù)調(diào)用。 · print a:將顯示整數(shù) a 的值 · print +a:將把 a 中的值加1,并顯示出來 · print name:將顯示字符串 name 的值 · print gdb_test(22):將以整數(shù)22作為參數(shù)調(diào)用 gdb_test() 函數(shù) · print gdb_test(a):將以變量 a 作為參數(shù)調(diào)用 gdb_test() 函數(shù) · bt:顯示當(dāng)前程序的函數(shù)調(diào)用堆棧。 · display 表達(dá)式:在單步運(yùn)行時將非常有用,使用display命令

62、設(shè)置一個表達(dá)式后,它將在每次單步進(jìn)行指令后,緊接著輸出被設(shè)置的表達(dá)式及值。如: display a · watch 表達(dá)式:設(shè)置一個監(jiān)視點(diǎn),一旦被監(jiān)視的“表達(dá)式”的值改變,gdb將強(qiáng)行終止正在被調(diào)試的程序。如: watch a · kill:將強(qiáng)行終止當(dāng)前正在調(diào)試的程序 · help 命令:help 命令將顯示“命令”的常用幫助信息 · call 函數(shù)(參數(shù)):調(diào)用“函數(shù)”,并傳遞“參數(shù)”,如:call gdb_test(55) · layout:用于分割窗口,可以一邊查看代碼,一邊測試: · layout src:顯示源代碼窗口 &

63、#183; layout asm:顯示反匯編窗口 · layout regs:顯示源代碼/反匯編和CPU寄存器窗口 · layout split:顯示源代碼和反匯編窗口 · Ctrl + L:刷新窗口 · quit:簡記為 q ,退出gdb 當(dāng)然,gdb的功能遠(yuǎn)不止這些,包括多進(jìn)程/多線程/信號/遠(yuǎn)程調(diào)試等功能在這里均沒有提及,有需要的讀者可以參考其它信息,本文的后續(xù)章節(jié)也將涉及一些內(nèi)容。推薦閱讀:用gdb調(diào)試程序3)調(diào)試實(shí)例:gdb ./hello_gdb        &

64、#160;  #啟動gdb并載入被調(diào)試程序list gdb_test                #顯示函數(shù) gdb_test 的代碼break cb_button         #在函數(shù) cb_button 處設(shè)置斷點(diǎn)info breakpoints         #顯示

65、所有斷點(diǎn)信息enable breakpoints     #啟動所有斷點(diǎn)run                              # 開始運(yùn)行程序#注:現(xiàn)在程序正常運(yùn)行,當(dāng)單擊按鈕“退出程序”后,將在函數(shù)“cb_button”處停止,因?yàn)檫@里被設(shè)置了一個斷點(diǎn)bt

66、                                #顯示當(dāng)前的函數(shù)調(diào)用堆棧display j               &#

67、160;      #對變量 j 進(jìn)行監(jiān)視next                            #運(yùn)行下一條指令print j            

68、             #顯示j的值print gdb_test(j)         #調(diào)用函數(shù) gdb_test 并使用 j 作為參數(shù)call gdb_test(+j)     #同上nextfinish            

69、60;             #退出函數(shù) cb_buttoncontinue                     #繼續(xù)運(yùn)行完程序quit           &#

70、160;                 # 退出gdb大家一起用gtk編程5(窗口布局初探)· 7、窗口布局初探 上回說到如何使用gdb來調(diào)試我們的程序,這回簡單地介紹下如何有效地進(jìn)行窗口布局,這也將是gtk編程基礎(chǔ)入門的最后一部分;在接下來的日子里,筆者將針對gtk中的所有內(nèi)容分專題,對每一部分都進(jìn)行詳細(xì)并且深入的描述,好了,進(jìn)入今天的主題。運(yùn)行效果圖:hello_box.c /* 本例的主要目的是在主窗口中旋轉(zhuǎn)

71、一個box控件,再在box控件中 * 放置一個單行編輯框和一個按鈕 * 并且單擊按鈕退出程序 */#include<gtk/gtk.h>/按鈕“button”的回調(diào)函數(shù)voidcb_button(GtkWidget *widget, gpointer data)/cb = call back        g_print("你單擊了按鈕n");        gtk_main_quit();in

72、tmain(int argc, char *argv)        GtkWidget *main_window; /主窗口對象        GtkWidget *hbox, *button, *editor;        gtk_init(&argc, &argv);        main_w

73、indow = gtk_window_new(GTK_WINDOW_TOPLEVEL);        g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(gtk_main_quit), NULL);        gtk_window_set_title(GTK_WINDOW(main_window), "Hello,Dubuntu2!");&

74、#160;       gtk_window_set_default_size(GTK_WINDOW(main_window), 200,50);        button = gtk_button_new_with_label("退出程序");        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button),NULL);        editor = gtk_entry_new();        hbox = gtk_hbox_new(FALSE, 10);        gtk_box_pack_start(GTK_BOX(hbox), editor, TR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論