Ubuntu/Debian/Linux Mint 中編譯安裝 wxWidgets 架構

來源:互聯網
上載者:User

wxWidgets是一個C++程式開發架構/庫, 支援Windows、Mac、Linux中使用相同的代碼跨平台開發。它主要用C++寫成,但也可以與其他語言綁定比如Python、Perl、Ruby。本教程中我將向你展示如何在基於Debian的linux中如Ubuntu和Linux Mint中編譯wxwidgets 3.0+。

從源碼編譯wxWidgets並不困難,僅僅需要幾分鐘。庫可以按不同的方式來編譯,比如靜態或者動態庫。

1. 下載 wxWidgets

第一步你需要從wxwidgets.org下載wxWidgets源碼檔案。

做完後,解壓到目錄。


2. 設定編譯環境

要編譯wxwidgets,我們需要一些工具包括C++編譯器,在Linux上是g++。所有這些可以通過apt-get工具從倉庫中安裝。

我們還需要wxWidgets依賴的GTK開發庫。

    $ sudo apt-get install libgtk-3-dev build-essential checkinstall

    這個叫做checkinstall的工具允許我們為wxwidgets建立一個安裝包,這樣之後就可以輕鬆的使用包管理器來卸載。

3. 編譯 wxWidgets

進入到wxWidgets解壓後的目錄。為了保持清潔,建立一個編譯用的目錄。

    $ mkdir gtk-build
    $ cd gtk-build/

現在運行configure和make命令。每個將花費一些時間來完成。

    $ ../configure --disable-shared --enable-unicode
    $ make

"--disable-shared"選項將會編譯靜態庫而不是動態庫。

make命令完成後,編譯就成功了。是時候安裝wxWidgets到正確的目錄。

更多資訊請參考install.txt和readme.txt,這可在wxwidgets中的/docs/gtk/目錄下找到。


4. 安裝 checkinstall

現在我們不使用"make install"命令,我們使用checkinstall命令來建立一個wxwidgets的deb安裝包。運行命令:

    $ sudo checkinstall

checkinstall會詢問幾個問題,請保證在提問後提供一個版本號碼,否則將會失敗。

完成這一切後,wxWidgets就安裝好了,deb檔案也會建立在相同的目錄下。


5. 追蹤安裝的檔案

如果你想要檢查檔案安裝的位置,使用dpkg命令後面跟上checkinstall提供的包名。

    $ dpkg -L package_name
    /.
    /usr
    /usr/local
    /usr/local/lib
    /usr/local/lib/libwx_baseu-3.0.a
    /usr/local/lib/libwx_gtk3u_propgrid-3.0.a
    /usr/local/lib/libwx_gtk3u_html-3.0.a
    /usr/local/lib/libwxscintilla-3.0.a
    /usr/local/lib/libwx_gtk3u_ribbon-3.0.a
    /usr/local/lib/libwx_gtk3u_stc-3.0.a
    /usr/local/lib/libwx_gtk3u_qa-3.0.a
    /usr/local/lib/libwx_baseu_net-3.0.a
    /usr/local/lib/libwxtiff-3.0.a

6. 編譯樣本

編譯wxWidgets完成後就可以馬上編譯樣本程式了。在相同的目錄下,一個新的sample目錄已經建立了。

進入它並運行下面的命令

    $ compile samples
    $ cd samples/
    $ make

make命令完成後,進入sample 子目錄,這裡就有一個可以馬上啟動並執行Demo程式了。


7. 編譯你的第一個程式

你完成編譯demo程式後,可以寫你自己的程式來編譯了。這個也很簡單。

假設你用的是C++,這樣的話你還可以使用編輯器的高亮特性。比如gedit、kate、kwrite等等。或者用全功能的IDE像Geany、Codelite、Codeblocks等等。

然而你的第一個程式只需要用一個文字編輯器來快速完成。

如下:

    #include <wx/wx.h>
    class Simple : public wxFrame
    {
    public:
        Simple(const wxString& title)
            : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
        {
            Centre();
        }
    };
    class MyApp : public wxApp
    {
    public:
        bool OnInit()
        {
            Simple *simple = new Simple(wxT("Simple"));
            simple->Show(true);
            return true;
        }
    };
    wxIMPLEMENT_APP(MyApp);

現在儲存並用下面的命令編譯。

    # compile
    $ g++ basic.cpp `wx-config --cxxflags --libs std` -o program
    # run
    $ ./program

和非標準的庫一起編譯

面展示的wx-config命令預設只支援標準的庫。如果你使用的是Aui庫,那麼你需要指定額外用到的庫。

    $ g++ code.cpp `wx-config --cxxflags --libs std,aui` -o program

更多的資訊參考這裡這裡。

資源

下載wxWidgets的源碼和協助 https://www.wxwidgets.org/downloads/

wxWidgets編譯的wiki頁面 https://wiki.wxwidgets.org/Compilingandgetting_started

使用wxWidgets最新版本(3.0+)的事項 https://wiki.wxwidgets.org/UpdatingtotheLatestVersionofwxWidgets




安裝wxWidgets遭遇的兩個問題解解決辦法


問題1:編譯中“記憶體耗盡”


  按照相關材料的提示,
  (1)在PATH變數中加入F:\Program Files\CodeBlocks\MinGW\bin;
  (2)開啟MS-DOS視窗,將目前的目錄設定為F:\wxWidgets-2.8.7\build\msw;
  (3)運行編譯wxWidgets的命令:

  編譯方法:


    mingw32-make -f makefile.gcc  MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug  

  編譯很慢。傷心的是,最後出來的結果,提示error。最後兩行的提示是:

    gcc_mswuddll\monodll_xh_bmpcbox.o: file not recognized: Memory exhausted  
    collect2.exe: error: ld returned 1 exit status  

  居然是Memory exhausted!
  得不到解釋,也想不出道道。換了幾次關鍵詞搜尋,終於找到了http://www.cnblogs.com/aozima/archive/2011/10/03/2198653.html,其中提到“記憶體耗盡,是因為32位系統最大隻能為應用程式分配2G的記憶體.”我的系統恰也是32位的。
  怎麼解決?
  解決方案:在編譯時間加入 -fno-keep-inline-dllexport 參數(內聯符號不匯出),這樣DLL檔案也小了,連結時佔用記憶體也小了。
  具體步驟:
  (1)找開F:\wxWidgets-2.8.7\build\msw中的config.gcc檔案;
  (2)修改config.gcc中的幾個參數:


    UNICODE ?= 1   
    CPPFLAGS ?= -Os -fno-keep-inline-dllexport  
    LDFLAGS ?= -s  
    RUNTIME_LIBS ?= static  

  (3)查看了一下GCC的版本,順便修改了GCC版本參數


    GCC_VERSION ?= 4.7.1  

  再運行。

  順利,再沒有出現Memory exhausted


問題2:串連中缺少檔案

  利用Code::Blocks提供的嚮導,產生一個GUI應用,作為體驗的開始。

  步驟按嚮導做就行。產生的程式要運行,有不少的問題,參考“CodeBlocks編譯wxWidgets設定”,工作得以繼續進行。
  語法錯誤就此消除,無非就是標頭檔找不到之類的。

  而挑戰,出現在串連階段。

  出現的錯誤提示是:


    ld.exe||cannot find -lwxmsw28d_core|  
    ld.exe||cannot find -lwxbase28d|  
    |=== Build finished: 2 errors, 0 warnings (0 minutes, 1 seconds) ===  

  這是找不到庫檔案。

  然而,這樣的庫檔案在哪兒呢?
  查看F:\wxWidgets-2.8.7\lib\gcc_dll中,出現的檔案如下:

  
  按搜尋到的資料,lwxbase28d要對應libwxbase28d.a,期望的檔案不存在。
  這時,必須正視編譯時間啟動並執行命令中的參數了。
  編譯命令是:


    mingw32-make -f makefile.gcc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1  

  搜尋得知,設定想要如何編譯wxWidgets,要編輯檔案confg.gcc,以,其中主要設定了如下選項:


    SHARED = 1                編譯成動態連結程式庫  
    UNICODE = 1               使用UNICODE(我是中文使用者,當然要它了)  
    BUILD = release           產生正式發行版  
    MONOLITHIC = 1            產生單一動態連結程式庫  

  其實,作為初體驗,懶得琢磨這些參數。
  換參數BUILD=debug再次編譯:


    mingw32-make -j2 -f makefile.gcc SHARED=1 BUILD=debug MONOLITHIC=1 UNICODE=1  

  在F:\wxWidgets-2.8.7\lib\gcc_dll中增加的檔案是

 
  乾脆,改SHARED=0 BUILD=release再來,運行


    mingw32-make -j2 -f makefile.gcc SHARED=0 BUILD=release MONOLITHIC=1  

  這次,增加了F:\wxWidgets-2.8.7\lib\gcc_lib檔案夾,其中的檔案是:

  
  將F:\wxWidgets-2.8.7\lib\gcc_lib加入到項目的search directories中,Built項目。令人沮喪的是還有錯誤,而高興的是,只有cannot find -lwxbase28d了。
  Build Target現在是“Debug”,試著改為“Release”。再Built項目。好事,通過,沒有問題。運行,利用嚮導產生的項目,正確運行!
  改回“Debug”,問題依然。我希望我的環境中,能夠編譯Debug版本的程式,這個問題要解決。
  然而,觀察發現,BUILD=release時,SHARED=0和SHARED=1的兩種情況都已經做過,無論用動態連結程式庫,還是用靜態連結庫,只要是產生正式發行版(release),現有的庫函數都已經具備。而缺少的lwxbase28d嘛,從名稱上看,這個d正是debug之意。
  於是,修改參數再編譯一遍,這次要產生的是支援靜態連結的Debug庫檔案:


    mingw32-make -j2 -f makefile.gcc SHARED=0 BUILD=debug MONOLITHIC=1  

  出現的檔案:

  
  迫不急待地運行項目。萬歲,Build Target是“Debug”時也正常了。
  記錄下這個過程。明天開始可以運行wxWidgets內建的Demo了。找到些感覺後,看書,再試著自己寫些小程式,適合我的菜鳥學生做的那種。

  這個安裝過程的經驗是:(1)遇到問題不退縮;(2)搞不清和不到搞清參數的時候,就調整參數,多產生些版本出來。其實,好多經驗之談,也是從這種試探中來的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.