C++中Boost庫(kù)裁剪與其應(yīng)用詳解
前言
Boost 庫(kù)涵蓋的范圍極廣,有字符串和文本處理相關(guān)子庫(kù)比如 format 庫(kù)和 regexp 庫(kù),有容器相關(guān)子庫(kù)比如 variant 庫(kù)(和 Qt 的 QVariant 有得一拼),有迭代器子庫(kù)比如 tokenizer 庫(kù)(可以把字符進(jìn)行 tokenize),還有算法、函數(shù)對(duì)象和高階編程相關(guān)子庫(kù)如functional 庫(kù)、lambda 庫(kù)和 signal 庫(kù),還有泛型編程、模板編程子庫(kù)如 call traits、mpl,還有并發(fā)編程相關(guān)的 thread 庫(kù),等等等等。
Boost 是如此強(qiáng)大,毫無(wú)疑問(wèn)它也很大。Windows 上安裝 boost 需要占用 2G+ 的空間,編譯配置起來(lái)也十分麻煩。
本文討論的是如何不配置 boost 庫(kù)而使用 boost 庫(kù)。
解決方案用一句話說(shuō)就是:
裁剪 boost 庫(kù),并在項(xiàng)目中內(nèi)嵌 boost 源碼,使項(xiàng)目脫離對(duì) boost 庫(kù)的依賴。
通過(guò)一個(gè)例子說(shuō)明 boost 庫(kù)裁剪的意義
或許你還是不明白 boost 庫(kù)裁剪到底是啥意思,那我們一起來(lái)跑一個(gè)例子。以我的 cmake-templates 里面的一個(gè) boost 代碼為例,源碼只有一個(gè) main.cpp,里面只有如下幾行:
#include <cstdio> #include <boost/date_time/posix_time/posix_time_types.hpp> int main( void ) { namespace pt = boost::posix_time; pt::ptime now = pt::second_clock::local_time(); printf( "%s\t->\t%04d-%02d-%02d %02d:%02d:%02d\n" , "date '+%Y-%m-%d %H:%M:%S'" , (int)now.date().year() , (int)now.date().month() , (int)now.date().day() , (int)now.time_of_day().hours() , (int)now.time_of_day().minutes() , (int)now.time_of_day().seconds() ); return 0; }
程序運(yùn)行輸出大概是:
date '+%Y-%m-%d %H:%M:%S' -> 2016-07-11 19:33:19
這 20 行不到的代碼,展示了 Linux 系統(tǒng)下一個(gè)常用指令 date
輸出當(dāng)前時(shí)間的效果(相當(dāng)于命令行下輸入 date '+%Y-%m-%d %H:%M:%S'
)。
如果你的系統(tǒng)配置了 Boost,那就到上面的鏈接下載源碼,進(jìn)入 boost 文件夾,這里一共有三個(gè)文件:一個(gè) main.cpp、一個(gè) CMakeLists.txt,一個(gè) README 說(shuō)明文檔。
但要運(yùn)行這個(gè)程序并不容易,尤其是在一切都要手工的 Windows 系統(tǒng)上:你必須自己去下載合適的 boost 版本,設(shè)定一些環(huán)境變量。
在 Linux 下則比較簡(jiǎn)單,只要三步(先下載源碼,并 cd 到源碼目錄):
sudo apt-get install -y libboost-all-dev cmake mkdir build && cd build cmake .. && make && ./BOOST
你不禁感慨,為了運(yùn)行一個(gè) 20 行不到的小程序,居然要手工安裝兩三個(gè) G 的 boost 庫(kù)!
這時(shí)候 boost 庫(kù)的裁剪,就顯得尤為重要了。我們不希望拿到代碼的人還要費(fèi)時(shí)間去配置 boost 庫(kù),我們也不希望自己的代碼要十分小心地,才能跑起來(lái)。我們要讓自己的代碼不論什么情況都能迅速地跑起來(lái)!
我們裁剪后的 boost 庫(kù),頭文件大概有 3.18 MB,cpp 文件有兩個(gè)約 11 KB??瓷先ネΥ螅菈嚎s完其實(shí)就 213 KB!拿到這份代碼,首先解壓 include.zip 到當(dāng)前文件夾,然后運(yùn)行 cmake 生成 VS 工程(或者 Linux 上的 makefile 工程),然后編譯、運(yùn)行。完全不需要再管那煩心的 boost 庫(kù)的配置了!
我想你一定能把這個(gè)程序跑起來(lái)的。無(wú)論你用什么操作系統(tǒng),用什么編譯器。
運(yùn)行起來(lái)更省心,這就是 boost 庫(kù)裁剪的意義。
我要怎么裁剪出自己需要的部分?
我們來(lái)深究一下怎么拿到上面那 3.18 MB 的頭文件,11 KB 的 cpp 文件。
首先,下載 Boost 庫(kù)源碼,你可以去 官網(wǎng)。我們只需要官方 release 的源碼里的 boost 和 libs 文件夾下的東西,所以我建議你下載我的備份。因?yàn)樗娴男『芏?,下載起來(lái)也很快。而且里面還打包了用于提取 boost 源碼的工具 bcp1。
然后,解壓下載到的壓縮包,進(jìn)入源碼文件夾,新建一個(gè)文件夾,比如叫 output
,然后在當(dāng)前窗口打開命令行,輸入 ./bcp.exe boost/date_time/posix_time/posix_time_types.hpp output
,這里 "./bcp.exe" 是我們的裁剪工具,"boost/date_time/posix_time/posix_time_types.hpp" 是我們自己項(xiàng)目中用到的 boost 頭文件,如果有多個(gè)頭文件,用空格隔開,把它們都敲進(jìn)命令行。2最后的 "output" 是輸出文件夾。
在 cmake 里,這個(gè)過(guò)程大概是
1)在源碼根目錄新建 include 文件夾,在根目錄的 CMakeLists.txt 加上 include_directories( ${CMAKE_SOURCE_DIR} );
2)新建 libs 文件夾,把裁剪出來(lái)的 cpp 文件放到這個(gè)文件下的 MiniBoost 文件加下,然后參考 district10/bcp-example-1/libs 寫好 CMakeLists 文件,再到根目錄的 CMakeLists 文件加上 add_subdirectory( libs);3)將裁剪出來(lái)的 miniboost 鏈接到我們的二進(jìn)制:target_link_libraries( ${PROJECT_NAME} MiniBoost )
。
你可以仔細(xì)對(duì)比看看鏈接系統(tǒng)安裝的 Boost 庫(kù)和使用自帶的裁剪后的 Boost 庫(kù)(我把它稱為 MiniBoost)兩者的區(qū)別和聯(lián)系
注意:一個(gè)需要注意的地方是,提取出來(lái)的頭文件里,boost/config/auto_link.hpp 里的內(nèi)容最好刪掉,不然在 Windows 平臺(tái)上,boost 會(huì)嘗試自動(dòng)鏈接。所以我通常把這個(gè)文件內(nèi)容清空。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能有所幫助,如果有疑問(wèn)大家可以留言交流。
上一篇:C++ boost 時(shí)間與日期處理詳細(xì)介紹
欄 目:C語(yǔ)言
下一篇:C++中的friend函數(shù)詳細(xì)解析
本文標(biāo)題:C++中Boost庫(kù)裁剪與其應(yīng)用詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1996.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子