頭文件(.h)、庫(kù)文件(.lib)、動(dòng)態(tài)鏈接庫(kù)文件(.dll)的關(guān)系與環(huán)境配置
第三方庫(kù)
一些常用的函數(shù)、類等會(huì)被封裝打包成庫(kù)(例如opencv),以供開發(fā)人員使用。為了能正確調(diào)用所需的庫(kù),需先告知所用的編程開發(fā)工具(例如Visual Studio)和操作系統(tǒng)在哪里尋找所需的庫(kù),這就是所謂的配置第三方庫(kù)。
一、基本概念
- 在程序的源文件(如 .c 和 .cpp 文件)編輯階段,為了使用第三方庫(kù),一般會(huì)在編輯器中使用 #include 指令來包含庫(kù)的頭文件( .h或 .hpp 文件),即需要告知 Visual Studio(編程工具)第三方庫(kù)的頭文件的位置。——配置附加包含目錄路徑(一般是庫(kù)目錄下/include文件夾)
- 源程序經(jīng)過預(yù)處理后需要編譯成目標(biāo)匯編程序。在編譯階段,編譯器會(huì)根據(jù)頭文件中聲明的函數(shù)、類等信息查找該函數(shù)或類的實(shí)現(xiàn)文件(如 .lib 、.dll文件),即需要告知 Visual Studio 第三方庫(kù)中的函數(shù)、類等實(shí)現(xiàn)文件的位置。——配置庫(kù)目錄路徑
- 源文件經(jīng)過編譯后會(huì)生成一系列目標(biāo)文件(如 .o 文件),然后鏈接器將目標(biāo)文件以及庫(kù)文件鏈接起來形成最終的可執(zhí)行文件(如 .exe 文件),即需要告知鏈接器具體需要鏈接第三方庫(kù)中的哪些庫(kù)文件。一般第三方庫(kù)會(huì)包含很多模塊,可以只選擇自己需要的模塊的庫(kù)文件,這樣會(huì)加快編譯調(diào)試速度。——配置附加依賴項(xiàng),即工程所需lib文件
- 鏈接器在鏈接目標(biāo)文件并生成最終的可執(zhí)行文件時(shí),包括靜態(tài)鏈接和動(dòng)態(tài)鏈接兩種方式。靜態(tài)鏈接就是將所用到的第三方庫(kù)的內(nèi)容包含進(jìn)程序的可執(zhí)行文件中(如 .exe 文件),這樣在沒有安裝所需庫(kù)的相應(yīng)功能的計(jì)算機(jī)上也可以直接運(yùn)行該程序(此時(shí).lib文件包含了實(shí)際執(zhí)行代碼、符號(hào)表等等),缺點(diǎn)是,如果用到的庫(kù)的內(nèi)容比較大的話,最終程序的可執(zhí)行文件相應(yīng)的也很大。動(dòng)態(tài)鏈接就是不將所用到的第三方庫(kù)的內(nèi)容包含進(jìn)程序的可執(zhí)行文件中,(此時(shí)lib文件只包含了地址符號(hào)表等,真正的執(zhí)行代碼位于動(dòng)態(tài)庫(kù)即dll文件中,而dll文件只在運(yùn)行期才會(huì)被調(diào)用,庫(kù)中的函數(shù)和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中)。這時(shí)就需要計(jì)算機(jī)上裝有第三方庫(kù),并正確配置計(jì)算機(jī)的環(huán)境變量,以便程序運(yùn)行時(shí)能正確找到所需的動(dòng)態(tài)鏈接庫(kù)(即.dll和.lib文件必須隨應(yīng)用程序一起發(fā)行)。——配置環(huán)境變量,即dll文件所在路徑,一般是/bin目錄下
二、環(huán)境配置
1 包含目錄配置
2 庫(kù)目錄配置
3 附加依賴項(xiàng)配置
4 環(huán)境變量配置




