為什麼 Boost 這麼大?

今天 kane 哥跟我說,Boost 編出來有 1 GB,想起來以前在醉資心也聽過有人這麼說…

那到底為什麼這麼大?

身為傳教士,當然不能回答說:

你問我!我擲交!

這種答案可是天理不容啊~啊~啊~啊~

套句聖主播說的話:揪竟~這個 boost 的背後,又有什麼不為人知的血淚因緣呢?文章的第一集,我們使用下面的指令來編譯:

bjam.exe --build-dir="your_dir\boost_1_35_0" --build-type=complete --toolset=msvc install

由於我們選擇 complete build type,所以 bjam 會產生出 12 個sublibrary,而 sublibrary 下又因為 vc 編譯組態可分為 single/multi-thread、dynamic/static link or debug/release mode、是否包含standard libary 四種不同,再檔名是否加上版本號碼的部份。算一算沒有七七四十九種,卻也大概一個 sublibrary 會有 18 種檔案。但檔案重複率很高就是了,像是下面以 Boost.DateTime 為例:

18 個檔案只有 10 種版本

下面則是 Boost.DateTime 各版本的名稱及檔案大小,單項下內字體顏色一樣者表示檔案內容一樣(用 vim diff 測試)。

Linking Type Mode Name Size
Dynamic Link Debug boost_date_time-vc80-mt-gd-1_35.dll
84.0 KB
(86,016 bytes)
boost_date_time-vc80-mt-gd-1_35.lib
26.6 KB
(27,278 bytes)
boost_date_time-vc80-mt-gd.lib
Release boost_date_time-vc80-mt-1_35.dll
48.0 KB
(49,152 bytes)
boost_date_time-vc80-mt-1_35.dll
26.4 KB
(27,120
bytes) 
boost_date_time-vc80-mt.dll
Static Link debug libboost_date_time-vc80-mt-gd-1_35.lib  
1.50 MB
(1,577,314
bytes)
libboost_date_time-vc80-mt-gd.lib
libboost_date_time-vc80-mt-sgd-1_35.lib 
1.66 MB
(1,747,582 bytes)

libboost_date_time-vc80-mt-sgd.lib
libboost_date_time-vc80-sgd-1_35.lib
1.66 MB
(1,747,486 bytes)

libboost_date_time-vc80-sgd.lib
Release libboost_date_time-vc80-mt-1_35.lib
523 KB
(535,964
bytes)
libboost_date_time-vc80-mt.lib
libboost_date_time-vc80-mt-s-1_35.lib
661 KB
(677,130
bytes)
libboost_date_time-vc80-mt-s.lib
libboost_date_time-vc80-s-1_35.lib
661 KB
(677,034
bytes)
libboost_date_time-vc80-s.lib

 

例外,若是想瞭解這些檔案的命名規則,可以參考
http://www.boost.org/doc/libs/1_35_0/more/getting_started/windows.html

基本規則是這樣的:
[prefix]boost_sublibrary-name-toolset-version-options-[version-number]

  1. prefix
    lib 開頭代表 static link library ,沒有的則是 dll 和 import library
  2. sublibrary-name 
    顧名思義
  3. toolset-version
    顧名思義
  4. option
    1. mt -> multithread
    2. s  -> static link with C++ Standard Library & runtime library
    3. d  -> sublibrary 的 code 有 debug information
    4. g  -> C++ Standard Library & runtime library 都含 debug information
  5. version number 
    boost 的 version number

3 則留言:

fr3@K 提到...

知道為何 --build-type=complete 不會 build 出 static link library 的 Boost.DateTime 嗎?

yuxioz 提到...

我蠻好奇 fr3@k 所說的問題答案,可以說明一下嗎?

yuxioz 提到...

另外,我想請教一下為什麼 Dynamic Link 的 dll 要有兩個版本?有版號跟沒版號的版本?

BTW,表格中第三行第六列(不含表頭)的副檔名標錯囉,應該是 lib 而不是 dll。

MiniFilter InstanceSetupCallback is not called?

一般來說,MiniFilter 的 InstanceSetupCallback 會在 filter manager 把 minifilter attache 到 volume 後呼叫。如果沒有的話,可以檢查一下 minifilter 的 INF 是否把 instance fla...