boost為什麼僅包含標頭檔案就能用?

時間 2021-05-05 20:02:51

1樓:痴佬陳

boost的元件有兩種,一種是完全在.hpp中實現的,於是只要包含標頭檔案即可。

但是還有很多元件是需要鏈結庫檔案的,這時候boost就使用了一種叫做自動鏈結的技術。

首先,在boost在編譯過程中,會根據編譯選項按照一定的規則命名庫檔案。

然後,利用巨集來組裝預處理命令,就能鏈結到指定的庫檔案了。

最後,舉個例子,libboost_atomic-vc141-mt-x64-1_66.lib

這是我前段時間用vs2017編譯的,從名字中我們可以看到,這是在x64編譯的多執行緒版本atomic庫,boost版本是1.66。

然後在boost/atomic/detail/link.hpp中,可以看到這樣兩行:

#define BOOST_LIB_NAME boost_atomic

#include

在auto_link.hpp中,又可以看到:

#ifdef BOOST_AUTO_LINK_TAGGED

#pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT ".lib")

#pragma comment(lib, libboost_atomic-vc141-mt-x64-1_66.lib)

例如其中的vc141對應BOOST_LIB_TOOLSET這個巨集,即編譯工具,在auto_link.hpp可發現當_MSC_VER大於等於1910時,BOOST_LIB_TOOLSET定義為vc141,而vs2017的_MSC_VER為1911。

其他細節就不說了,總之只要在vs的設定中包含編譯好的lib目錄,就能自動鏈結到對應的庫檔案了。

2樓:Milo Yip

因為大多數元件都是基於模板的,都只需要(也必須要)在標頭檔案裡實現。不用模版的部分,如果也想做成 headers-only library,也可以把所有函式在標頭檔案 inline 實現。

RapidJSON 也是這樣的庫。

在 C 中防止標頭檔案被重複包含時為什麼同時使用 ifndef 和 pragma once?

吉林小伙 vc6 你新增的class標頭檔案就會自動加上ifndef和pragma once,如 SuperSodaSea 說得一樣,的確是為了相容性。後來的ide就直接拋棄ifndef了,畢竟分析它也是要耗時間的。gcc也有對ifndef的優化。實際上,編譯器對頭檔案的處理是有優化的,並不是你in...

為什麼C C 要分為標頭檔案和原始檔?

見我的另乙個回答 SmartLife366 標頭檔案有兩個作用 1,告訴編譯器有哪些符號可以鏈結。2,告訴使用都該如何正確地使用模組,是份模組使用說明書。原始檔只負責實現功能。我認為這種設計是非常合理的。對使用者,我們只需要看標頭檔案就好了。標頭檔案中沒有冗長的實現,簡潔一目了然。 被量化的狐狸 我...

為什麼C 標頭檔案喜歡把乙個型別通過typedef定義出無數個新名字,這有什麼意義嗎?

習慣和風格問題。比如,在同時引用多個第三方庫,當它的命名空間相似,函式名 引數列表完全相同時,你還可以通過自定義的型別名來感知這個介面是幹什麼的。 exiledkingcc 歷史遺留問題。比如一開始沒有uint8 t這樣的型別,就只能用typedef了。其它的情況也類似,需要由名字直接表達其意義,就...