天天看點

選擇性編譯Boost元件

雖然很多Boost元件都隻有頭檔案,不需要編譯,但是有些Boost元件,如program_options、regex等還是需要編譯生成庫的。考慮到目前的程式需要用到program_options、regex等元件,還可能用到filesystem元件,是以還是決定先把Boost編譯一下。

  習慣性的找Boost某個元件或者整個Boost的*.dsp或者*.sln檔案,沒找到。于是隻好老老實實地去看文檔,Getting Started on Windows一節有說,需要獲得bjam。得,先編譯bjam吧。好在bjam的源碼也在Boost源碼包中,不需要特别去下載下傳。

  進入tools/jam目錄(習慣用/來表示目錄分隔,寫起來友善),一眼就看見了,build_dist.bat,運作它當然是可以得到bjam.exe的,但是貌似這個批處理還幹了些其它的事情,是以還是根據各方面的資料,再進入stage目錄,找到build.bat來運作。這個批處理還算聰明,居然能自己配置VC的相關路徑。

  跑tools/jam/stage/build.bat沒遇到啥問題。結果在stage下面産生了bin.ntx86和boost-jam-3.1.17-1-ntx86等目錄——如果jam版本不一樣,舉一反三。這兩個目錄下都有bjam.exe,一樣的,不過看起來,boost-jam-3.1.17-1-ntx86目錄更像是發行目錄,因為這裡面隻有bjam.exe和license說明。我本來也不準備要改PATH環境,是以随便找一個bjam.exe拷貝到boost主目錄下去,準備編譯。

  有了bjam之後要編譯boost就簡單了,直接到指令行下運作bjam就OK(貌似不到指令行下直接輕按兩下運作也行)。不過這樣據說會編譯全部boost庫和N種配置,費時還浪費磁盤空間。我隻會用到上面說的三個元件,隻編譯那三個元件,每個兩種配置(debug一種,release一種)就好。為了省時省空間,就費點力自己寫幾個指令吧。運作個bjam --help,看看指令行是咋個寫的:

Usage:
  bjam [options] [properties] [install|stage]
      

  指令行道是簡單,就是選項+屬性+目标。目标就兩個install和stage,其中install根據指定的安裝目錄,把頭檔案和編譯出來的.lib都拷貝過去——浪費空間,就選stage吧,預設就是,都不用特别指定了。

  選項用預設的也行,有幾個屬性可能需要修改:

  1. --with-<library>,這個選項指定需要編譯的元件。如果不指定,就是編譯全部Boost庫。其中<library>就是Boost主目錄下libs目錄中的子目錄名。比如編譯正規表達式庫這個選項設定為:--with-regex。

  2. --stagedir=<dir>,這個選項指定編譯的結果拷貝到哪裡。bjam會把編譯生成的*.lib和*.dll拷貝到指定目錄下的lib目錄。預設是Boost主目錄下的stage目錄。其實,就用預設值挺好的。

  3. --build-type=complate,意思是嘗試所有可能的組合,比如多線程靜态,多線程DLL等。在使用--with參數指定了元件的情況下,使用這個選項可以少些配置。不過編譯出來的東西還是很可觀,一個元件的這些庫産生出來至少要占幾十M的空間。是以,我甯願不用這個選項,配置下面要提到的編譯屬性來選擇性的編輯Boost元件。

  屬性(properties)有這麼一些:

toolset=toolset
  variant=debug|release
  link=static|shared
  threading=single|multi
  runtime-link=static|shared
      

  toolset指定編譯工具集,可用的工具集在文檔中有個清單。在Windows下一般是用VC編譯,對應的工具集是msvc。如果不指定toolset,預設也是用的msvc。

  variant指定編譯的是debug版本還是release版本。分别用于VC項目中的Debug配置和Release配置。

  link是指編譯出來的Boost元件庫是靜态還是動态。靜态Boost元件庫會直接連結到你的項目中,而動态元件庫會産生一個相應的.dll檔案,運作時需要這個.dll檔案的支援(配置在PATH中或放置在應用程式所在目錄)。我覺得犯不着随一個應用程式釋出一大堆動态庫,而且你的.exe就算編譯成10M,在如今的磁盤空間和網速下,都是可以接受的,是以一般都配置成static了。

  threading,指定連接配接單線程還是多線程的C++運作時庫。

  runtime-link,指定C++運作時庫是用靜态的還是動态的。

  這些屬性中,variant、threading和runtime-link是可以根據VC項目的“運作庫”配置(在項目屬性→C/C++→代碼生成→運作庫)來決定的。比如下表:

運作庫設定對應的Boost編譯屬性配置

運作庫設定 variant threading runtime-link
多線程(/MT) release multi static
多線程調試(/MTd) debug shared
多線程DLL(/MD)
多線程調試DLL(/MDd)

  因為我的VC 2008 Express沒有單線程的相關配置,是以隻列了多線程的項出來。如果要為單線程的“運作庫”配置Boost編譯屬性,隻需要相應地把threading的值改為single就行了。

  總的來說,編譯指令也不是很麻煩。比如,編譯正規表達式的“多線程調試DLL”和“多線程”兩種配置,就用下面兩個指令來分别完成:

繼續閱讀