欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中Boost庫裁剪與其應(yīng)用詳解

 更新時(shí)間:2016年10月27日 10:01:38   投稿:daisy  
大家都知道STL全稱"標(biāo)準(zhǔn)模板庫(Standard Template Library)",其實(shí)它是一套標(biāo)準(zhǔn),可能有不同的實(shí)現(xiàn),它是 C++ 的"標(biāo)準(zhǔn)庫"。Boost 則是一個(gè) C++ 庫,被稱為"C++ 準(zhǔn)標(biāo)準(zhǔn)庫"。那么這篇文章文章我們就來詳細(xì)的介紹C++Boost庫的裁剪與其應(yīng)用,感興趣的朋友可以一起學(xué)習(xí)。

前言

Boost 庫涵蓋的范圍極廣,有字符串和文本處理相關(guān)子庫比如 format 庫和 regexp 庫,有容器相關(guān)子庫比如 variant 庫(和 Qt 的 QVariant 有得一拼),有迭代器子庫比如 tokenizer 庫(可以把字符進(jìn)行 tokenize),還有算法、函數(shù)對象和高階編程相關(guān)子庫如functional 庫、lambda 庫和 signal 庫,還有泛型編程、模板編程子庫如 call traits、mpl,還有并發(fā)編程相關(guān)的 thread 庫,等等等等。

Boost 是如此強(qiáng)大,毫無疑問它也很大。Windows 上安裝 boost 需要占用 2G+ 的空間,編譯配置起來也十分麻煩。

本文討論的是如何不配置 boost 庫而使用 boost 庫。

解決方案用一句話說就是:

裁剪 boost 庫,并在項(xiàng)目中內(nèi)嵌 boost 源碼,使項(xiàng)目脫離對 boost 庫的依賴。

通過一個(gè)例子說明 boost 庫裁剪的意義

或許你還是不明白 boost 庫裁剪到底是啥意思,那我們一起來跑一個(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 說明文檔。

但要運(yùn)行這個(gè)程序并不容易,尤其是在一切都要手工的 Windows 系統(tǒng)上:你必須自己去下載合適的 boost 版本,設(shè)定一些環(huán)境變量。

在 Linux 下則比較簡單,只要三步(先下載源碼,并 cd 到源碼目錄):

sudo apt-get install -y libboost-all-dev cmake
mkdir build && cd build
cmake .. && make && ./BOOST

你不禁感慨,為了運(yùn)行一個(gè) 20 行不到的小程序,居然要手工安裝兩三個(gè) G 的 boost 庫!

這時(shí)候 boost 庫的裁剪,就顯得尤為重要了。我們不希望拿到代碼的人還要費(fèi)時(shí)間去配置 boost 庫,我們也不希望自己的代碼要十分小心地,才能跑起來。我們要讓自己的代碼不論什么情況都能迅速地跑起來!

我們裁剪后的 boost 庫,頭文件大概有 3.18 MB,cpp 文件有兩個(gè)約 11 KB??瓷先ネΥ?,但是壓縮完其實(shí)就 213 KB!拿到這份代碼,首先解壓 include.zip 到當(dāng)前文件夾,然后運(yùn)行 cmake 生成 VS 工程(或者 Linux 上的 makefile 工程),然后編譯、運(yùn)行。完全不需要再管那煩心的 boost 庫的配置了!

我想你一定能把這個(gè)程序跑起來的。無論你用什么操作系統(tǒng),用什么編譯器。

運(yùn)行起來更省心,這就是 boost 庫裁剪的意義。

我要怎么裁剪出自己需要的部分?

我們來深究一下怎么拿到上面那 3.18 MB 的頭文件,11 KB 的 cpp 文件。

首先,下載 Boost 庫源碼,你可以去 官網(wǎng)。我們只需要官方 release 的源碼里的 boost 和 libs 文件夾下的東西,所以我建議你下載我的備份。因?yàn)樗娴男『芏啵螺d起來也很快。而且里面還打包了用于提取 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è)過程大概是

1)在源碼根目錄新建 include 文件夾,在根目錄的 CMakeLists.txt 加上 include_directories( ${CMAKE_SOURCE_DIR} );

2)新建 libs 文件夾,把裁剪出來的 cpp 文件放到這個(gè)文件下的 MiniBoost 文件加下,然后參考 district10/bcp-example-1/libs 寫好 CMakeLists 文件,再到根目錄的 CMakeLists 文件加上 add_subdirectory( libs);3)將裁剪出來的 miniboost 鏈接到我們的二進(jìn)制:target_link_libraries( ${PROJECT_NAME} MiniBoost ) 。

你可以仔細(xì)對比看看鏈接系統(tǒng)安裝的 Boost 庫和使用自帶的裁剪后的 Boost 庫(我把它稱為 MiniBoost)兩者的區(qū)別和聯(lián)系

注意:一個(gè)需要注意的地方是,提取出來的頭文件里,boost/config/auto_link.hpp 里的內(nèi)容最好刪掉,不然在 Windows 平臺(tái)上,boost 會(huì)嘗試自動(dòng)鏈接。所以我通常把這個(gè)文件內(nèi)容清空。

總結(jié)

以上就是這篇文章的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能有所幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • 聊聊C++中右值引用和移動(dòng)構(gòu)造函數(shù)的使用

    聊聊C++中右值引用和移動(dòng)構(gòu)造函數(shù)的使用

    這篇文章主要是來和大家一起聊聊C++中右值引用和移動(dòng)構(gòu)造函數(shù)的使用,文中通過示例進(jìn)行了詳細(xì)講解,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-07-07
  • gdb調(diào)試的簡單操作總結(jié)

    gdb調(diào)試的簡單操作總結(jié)

    gdb是一個(gè)命令行下的、功能強(qiáng)大的調(diào)試器,這篇文章主要為大家詳細(xì)介紹了gdb?調(diào)試的一些簡單操作,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-08-08
  • C語言算法的定義及分析詳解

    C語言算法的定義及分析詳解

    這篇文章主要為大家詳細(xì)介紹了C語言算法的定義及分析,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C語言strcpy庫函數(shù)詳解

    C語言strcpy庫函數(shù)詳解

    這篇文章主要為大家介紹了C語言strcpy庫函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 簡單談?wù)凜語言中的= 和==、!=

    簡單談?wù)凜語言中的= 和==、!=

    這篇文章主要給大家介紹了關(guān)于C語言中= 和==、!=的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • C語言枚舉與聯(lián)合圖文梳理講解

    C語言枚舉與聯(lián)合圖文梳理講解

    枚舉顧名思義就是把所有的可能性列舉出來,像一個(gè)星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個(gè)聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最大的變量的內(nèi)存,其他的變量都在那個(gè)變量占據(jù)空間
    2023-01-01
  • C語言簡明講解類型轉(zhuǎn)換的使用與作用

    C語言簡明講解類型轉(zhuǎn)換的使用與作用

    類型轉(zhuǎn)換(type?cast),是高級語言的一個(gè)基本語法。它被實(shí)現(xiàn)為一個(gè)特殊的運(yùn)算符,以小括號內(nèi)加上類型名來表示,接下來讓我們一起來詳細(xì)了解
    2022-04-04
  • C++實(shí)現(xiàn)簡易通訊錄功能

    C++實(shí)現(xiàn)簡易通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡易通訊錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++ Boost Coroutine使用協(xié)程詳解

    C++ Boost Coroutine使用協(xié)程詳解

    通過Boost.Coroutine,可以在C++中使用協(xié)程。協(xié)程是其他編程語言的一個(gè)特性,通常使用關(guān)鍵字yield來表示協(xié)程。在這些編程語言中,yield可以像return一樣使用
    2022-11-11
  • C語言?模擬實(shí)現(xiàn)strlen函數(shù)詳解

    C語言?模擬實(shí)現(xiàn)strlen函數(shù)詳解

    在 C 語言 中我們要獲取 字符串 的長度,可以使用strlen 函數(shù),strlen 函數(shù)計(jì)算字符串的長度時(shí),直到空結(jié)束字符,但不包括空結(jié)束字符,因?yàn)?nbsp;strlen 函數(shù)時(shí)不包含最后的結(jié)束字符的,因此一般使用 strlen函數(shù)計(jì)算的字符串的長度會(huì)比使用 sizeof 計(jì)算的字符串的字節(jié)數(shù)要小
    2022-04-04

最新評論