選擇性編譯Boost元件

2021-09-21 03:01:19 字數 2809 閱讀 2360

雖然很多boost元件都只有標頭檔案,不需要編譯,但是有些boost元件,如program_options、regex等還是需要編譯生成庫的。考慮到目前的程式需要用到program_options、regex等元件,還可能用到filesystem元件,所以還是決定先把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-,這個選項指定需要編譯的元件。如果不指定,就是編譯全部boost庫。其中就是boost主目錄下libs目錄中的子目錄名。比如編譯正規表示式庫這個選項設定為:--with-regex。

2. --stagedir=,這個選項指定編譯的結果拷貝到**。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++→**生成→執行庫)來決定的。比如下表:

執行庫設定

variant

threading

runtime-link

多執行緒(/mt)

release

multi

static

多執行緒除錯(/mtd)

debug

multi

shared

多執行緒dll(/md)

release

multi

static

多執行緒除錯dll(/mdd)

debug

multi

shared

因為我的vc 2008 express沒有單執行緒的相關配置,所以只列了多執行緒的項出來。如果要為單執行緒的「執行庫」配置boost編譯屬性,只需要相應地把threading的值改為single就行了。

總的來說,編譯命令也不是很麻煩。比如,編譯正規表示式的「多執行緒除錯dll」和「多執行緒」兩種配置,就用下面兩個命令來分別完成:

d:/boost_1_39_0>bjam toolset=msvc link=static threading=multi variant=debug runtime-link=shared --with-regex

d:/boost_1_39_0>bjam toolset=msvc link=static threading=multi variant=release runtime-link=static --with-regex

編譯boost用的是非常規方法,所以寫這篇部落格備忘。

Xcode選擇性編譯

首先包含標頭檔案 import 在 檔案中定義了很多巨集 define iphone 6 0 60000 define iphone 6 1 60100 define iphone 7 0 70000 define iphone 7 1 70100 define iphone 8 0 80000 d...

mysql選擇性 Mysql索引的選擇性

對於索引的使用,mysql並不一直都是用採用正確的決定的。參考乙個簡單的表 create table r2 id int 11 default null,id1 int 11 default null,cname varchar 32 default null,key id1 id1 engine ...

索引 選擇性

索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記 錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980 2000 0.99。乙個索引的選擇性越接近於1,這個索引的效率就越高。如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於...