<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Picses' sky

    Picses' sky
    posts - 43, comments - 29, trackbacks - 0, articles - 24

    win32下基于eclipse的GTK+編譯環境[轉載]

    Posted on 2007-12-28 23:11 Matthew Chen 閱讀(1149) 評論(0)  編輯  收藏 所屬分類: Others
    GTK+是遵循LGPL協議的一個優秀的GUI類庫.基于C語言開發,是GNOME的基礎,也是Linux下 GUI程序的首選.同時,GTK+也是一個跨平臺的GUI庫,win32下寫"原生"GUI程序(商業的和非開源的也都不需付費),GTK+都是一個不錯的選擇! 本文基于我的實踐,介紹了windows下用eclipse/CDT 來搭建GTK+編譯環境的步驟,并成功編譯運行了GTK+的"hello world"程序! 希望對那些想在win32下開發GTK+程序的朋友能有所幫助.
    轉載請注明出處: http://zhw618.blogchina.com


    1. 為什么俺選 eclipse ?

        
    eclipse 是一個開源的優秀的IDE,主要是用于開發調試Java程序.同時它也是一個平臺,通過CDT插件可以提供一個完整的C/C++開發環境.eclipse 的主頁是   http://www.eclipse.org ,上面可以下載到最新的 eclipse和CDT,而且還有中文語言包,相當的不錯.
       
          開始也想過用其它的IDE,比如 Dev-cpp (主頁 http://dev-cpp.sourceforge.net) ,可是它的編輯器只支持GBK中文編碼,不支持UTF8. 而我們知道GTK+是支持國際化的,所有的c源文件最好是UFT8的. 如果.c文件是GBK編碼,那么里面的中文,編譯出來都是亂碼.要想消除亂碼,必須把文件中的所有中文string串通過下面這個函數來轉換:
          g_locale_to_utf8("世界你好",-1,0,0,0)
    這樣很是麻煩.而eclipse支持多種編碼,選用utf8來編輯源文件,就沒有中文亂碼問題啦,很是方便,呵呵

         eclipse的跨平臺性也是我選擇它的一個重要原因! 我們知道,linux下vim,emacs對于我們這些習慣了win下的編輯器的來說,還是有點麻煩的. eclipse可以運行在linux等平臺上,這樣,我們就可以在linux下使用同一個IDE--eclipse來開發啦,這樣降低了win程序員編寫 linux程序的門檻,呵呵.

         嘻嘻,總之,eclipse備受業界好評,應該也不會讓我們失望的!再說,熟悉了eclipse,以后學習java的話IDE也不用重新去適應啦,^_^

    2. win32下GNU 編譯環境搭建
      
       
    eclipse和dev-cpp這些都是調用MinGW或者Cygin來編譯調試C/C++程序的. 建議使用MinGW,它全稱是Minimal GNU for Win,是GNU開發工具在win32平臺上的一個移植,不同于Cygin,MinGW是原生的win32移植,不需要另外的POSIX模擬中間層的支持.另外MinGW項目也發布了一個最小的posix實現接口--msys,移植了很多linux下很方便的小工具,比如ls,vi,rvxt等等. MinGW項目的主頁是
         http://www.mingw.org
    我們可以在上面下載最新的   MinGW-3.2.0-rc-3.exe 和 MSYS-1.0.10.exe 這兩個文件,安裝的時候先安裝Mingw,然后安裝msys.安裝完msys之后會跳出一個問題,選y (yes), 然后它問你是不是已經安裝了 MinGW, 選y,然后按它的例子輸入MinGW的安裝路徑(比如c:/MinGW),這樣msys就把這個路徑mount到了安裝路徑的msys目錄下,可以直接使用Mingw的那些工具了.

        好了.裝好這兩個以后我們就要eclipse編譯c文件需要的gcc,gdb,make工具了.為了eclipse能找到它們,要把c:\MinGW\ bin目錄加到windows的環境變量PATH中. 需要說明的是,c:\MinGW\bin目錄下的make不是GNU的make,而是mingw32-make.exe,這個是make在windows 下的版本,由于沒有posix完整接口,這個make缺少一些標準make的功能,同時也有一些linux下make所不具備的功能. 因為我們后面要用到pkg-config來自動配置GTK+庫的路徑,這是mingw32-make.exe所不支持的. msys中提供的GNU make是可以的,為了使用它,我們還得把msys安裝目錄下的bin目錄加到環境變量PATH中.

    3. 安裝GTK+庫的win32 port

         GTK在windows上的移植,目前常見的主要有兩個項目:gimp-win和glade-win32,分別在sourceforge.net上有各自的主頁.前一個是官方的,不過 GTK+-dev包不是完全打包好的,使用起來不是很方便,推薦用后一個.
         gimp-win的地址:
              http://www.gimp.org/~tml/gimp/win32/downloads.html
              http://sourceforge.net/projects/gimp-win/
         glade-win32的地址:
              http://sourceforge.net/projects/gladewin32/  

              去下載最新的gtk+-win32-dev 包,雙擊運行安裝就好了.安裝程序自動注冊了環境變量,很方便.

    4. 安裝eclipse和CDT

          到 http://www.eclipse.org上下載eclipse和CDT,解壓到同一個目錄下,比如 D:\eclipse ,運行eclipse.exe 即可
          注意的是:   CDT要搭載對應的版本的eclipse使用,下載時候閱讀說明選擇正確版本的CDT即可

    5. 編譯GTK+版的hello world程序.

        打開eclipse,file-> new-> project, 里面多了c和c++兩種工程類型,選擇c,建一個managed make c project(自動產生makefile文件).
    eclipse自動關聯到c程序的視圖,呵呵,真的是挺周到的.
         左邊的工程文件夾那里選 new,新建一個 c source file, 把下面的這個hello world 程序拷貝進去,并保存.
    ################################################################
    #include <gtk/gtk.h>

    /* This is a callback function. The data arguments are ignored
    * in this example. More on callbacks below. */
    static void hello( GtkWidget *widget,
                        gpointer    data )
    {
         g_print ("Hello World\n");
    }

    static gboolean delete_event( GtkWidget *widget,
                                   GdkEvent   *event,
                                   gpointer    data )
    {
         /* If you return FALSE in the "delete_event" signal handler,
          * GTK will emit the "destroy" signal. Returning TRUE means
          * you don't want the window to be destroyed.
          * This is useful for popping up 'are you sure you want to quit?'
          * type dialogs. */

         g_print ("delete event occurred\n");

         /* Change TRUE to FALSE and the main window will be destroyed with
          * a "delete_event". */

         return TRUE;
    }

    /* Another callback */
    static void destroy( GtkWidget *widget,
                          gpointer    data )
    {
         gtk_main_quit ();
    }

    int main( int    argc,
               char *argv[] )
    {
         /* GtkWidget is the storage type for widgets */
         GtkWidget *window;
         GtkWidget *button;
        
         /* This is called in all GTK applications. Arguments are parsed
          * from the command line and are returned to the application. */
         gtk_init (&argc, &argv);
        
         /* create a new window */
         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        
         /* When the window is given the "delete_event" signal (this is given
          * by the window manager, usually by the "close" option, or on the
          * titlebar), we ask it to call the delete_event () function
          * as defined above. The data passed to the callback
          * function is NULL and is ignored in the callback function. */
         g_signal_connect (G_OBJECT (window), "delete_event",
                   G_CALLBACK (delete_event), NULL);
        
         /* Here we connect the "destroy" event to a signal handler.  
          * This event occurs when we call gtk_widget_destroy() on the window,
          * or if we return FALSE in the "delete_event" callback. */
         g_signal_connect (G_OBJECT (window), "destroy",
                   G_CALLBACK (destroy), NULL);
        
         /* Sets the border width of the window. */
         gtk_container_set_border_width (GTK_CONTAINER (window), 10);
        
         /* Creates a new button with the label "Hello World". */
         button = gtk_button_new_with_label ("世界你好!");
        
         /* When the button receives the "clicked" signal, it will call the
          * function hello() passing it NULL as its argument.   The hello()
          * function is defined above. */
         g_signal_connect (G_OBJECT (button), "clicked",
                   G_CALLBACK (hello), NULL);
        
         /* This will cause the window to be destroyed by calling
          * gtk_widget_destroy(window) when "clicked".   Again, the destroy
          * signal could come from here, or the window manager. */
         g_signal_connect_swapped (G_OBJECT (button), "clicked",
                       G_CALLBACK (gtk_widget_destroy),
                                   G_OBJECT (window));
        
         /* This packs the button into the window (a gtk container). */
         gtk_container_add (GTK_CONTAINER (window), button);
        
         /* The final step is to display this newly created widget. */
         gtk_widget_show (button);
        
         /* and the window */
         gtk_widget_show (window);
        
         /* All GTK applications must have a gtk_main(). Control ends here
          * and waits for an event to occur (like a key press or
          * mouse event). */
         gtk_main ();
        
         return 0;
    }
    ######################################################
    保存之后eclipse馬上開始編譯啦,有很多錯誤! 這是為什么啊?
    不要著急, 這主要是eclipse不知道 GTK+的頭文件路徑,以及不知道與GTK的哪些庫文件來連接.
    解決這個問題有兩種方法:
       1)   編輯makefile文件,把這些 路徑以參數 -I(include路徑) 和 -l(gtk的lib文件) 的方式告訴gcc
            編譯時候指定include路徑,gcc的參數有(假定GTK裝在c:\GTK目錄下):
            -IC:/GTK/include/gtk-2.0 -IC:/GTK/lib/gtk-2.0/include -IC:/GTK/include/atk-1.0 -IC:/GTK/include/pango-1.0                -IC:/GTK/include/glib-2.0 -IC:/GTK/lib/glib-2.0/include  
          
            連接時候需要指定 GTK+ 的lib庫,gcc的參數有
          -LC:/GTK/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv  
          
            有了這些路徑參數就可以成功編譯了.編輯makefile文件需要有make的知識,容易出錯,我們也可以在eclipse的 project->properties(工程屬性)
    然后選 c/c++ build ,右邊的tools setting 標簽頁里面 來一個一個填上這些 -I 路徑和 -l庫,目錄和庫不少,所以這樣也比較麻煩.

       2)   用pkg-config 工具來幫忙生成 這些include路徑和 lib庫
            也可以用pkg-config 來幫忙生成 1) 中繁瑣的gcc參數.pkg-config在安裝GTK+-dev 時候已經有了,不需要額外安裝. 我們可以在 cmd窗口中輸入:   pkg-config   --cflags gtk+-2.0   輸出的就是include路徑的gcc參數, pkg-config   --libs gtk+-2.0 輸出lib庫的gcc參數.這個工具使用起來相當方便,make文件可以寫成這樣:
           gcc   -o hello.exe hello.c     `pkg-config   --cflags gtk+-2.0` `pkg-config   --libs gtk+-2.0`
    然后make的時候,make命令就會自動用 pkg-config的輸出替換掉 pkg-config命令(msys中的make.exe可以,而mingw32-make.exe不支持).

          下面我們就在eclipse里面指定這兩個pkg-config命令,讓eclipse幫我們生成的makefile可以找到GTK+ 的include文件和 lib包.
       1) project->properties(工程屬性),然后選 c/c++ build ,右邊的tools setting 標簽頁里面選 GCC C++ Complier, 這個項目下的選項供我們來設定一些gcc的編譯參數.如下圖所示
       
    選擇Miscellanous, 把`pkg-config   --cflags gtk+-2.0`填入other flags 的最后面. 如果還有其它選項也可以接在后面(后面我們還要添加一個 -mms-bitfields選項).
       
         2)連接選項配置. 還是上圖,選GCC C++ Linker, 其下的選項供我們配置連接選項.點擊Miscellanous如下圖所示

    在Other objects 里面填上 `pkg-config   --libs gtk+-2.0` 命令.(填上后eclipse會自動又加一個" ",點編輯,去掉這對引號).
    經我試驗, 要是填在最上面的 linker flags欄里面的話 , `pkg-config   --libs gtk+-2.0`選項是放在緊跟gcc后的第一個選項,
    make時候不會自動替換成它的輸出(俺也不知道為何),   而other   objects 里面的選項是放在gcc   命令的最后面的,make的時候就可以自動用輸出替換,真是奇怪.呵呵.
          還有,如果想讓編譯出來的程序沒有那個cmd的dos窗口,還需要加一個連接選項 -mwindows (如上圖中示).這個不管加上邊還是下邊都可以.

    點擊apply以后,eclipse又開始自動編譯啦.這下什么錯誤也沒有了.   到目錄樹下debug目錄下查看,多了hello.o 和 hello.exe文件.
    雙擊hello.exe運行程序, 囈??? 出來了個錯誤窗口,說需要加 -mms-bitfields 編譯參數!!
    返回來加上這個參數(圖1中所示),保存,自動編譯,重新運行hello.exe,這下一切OK,我們的第一個GTK+程序誕生了,呵呵,太高興了!!
                                                                       
    enjoy GTK! good lucy!

    主站蜘蛛池模板: 国产91免费在线观看| 免费成人高清在线视频| 日韩在线播放全免费| 亚洲AV无码一区东京热久久| 久久国产精品免费一区| 最新亚洲成av人免费看| 巨胸喷奶水视频www免费视频 | 久久精品女人天堂AV免费观看| 亚洲综合一区二区国产精品| 日韩精品极品视频在线观看免费| 亚洲视频在线观看免费| 9420免费高清在线视频| 亚洲国产av一区二区三区丶| 黄瓜视频影院在线观看免费| 亚洲 欧洲 自拍 另类 校园| 日本黄色免费观看| 亚州**色毛片免费观看| 亚洲精品高清无码视频| 在线毛片片免费观看| 亚洲乱码日产精品BD在线观看| 在线观看成人免费| 免费一级做a爰片久久毛片潮| 亚洲无线码一区二区三区| 三年片在线观看免费观看大全动漫 | 99免费精品视频| 久久精品国产亚洲AV无码娇色| 国产男女爽爽爽爽爽免费视频| 中文字幕亚洲综合久久综合| 免费在线观看日韩| 久久一本岛在免费线观看2020| 久久狠狠爱亚洲综合影院| 全部免费a级毛片| 日韩a级无码免费视频| 亚洲一区中文字幕在线观看| 全黄性性激高免费视频| 色www永久免费| 亚洲伊人久久大香线蕉AV| 国产亚洲美女精品久久久2020| jjizz全部免费看片| 免费观看四虎精品成人| 亚洲av无码潮喷在线观看|