h頭文件作用:聲明函數接口
dll動態鏈接庫作用:含有函數的可執行代碼
lib庫有兩種:
(1)靜態鏈接庫(Static Libary,以下簡稱“靜態庫”)
(2)動態連接庫(DLL,以下簡稱“動態庫”)的導入庫(Import Libary,以下簡稱“導入庫”)
兩者的區別:
實質是不一樣的東西。
靜態庫本身就包含了實際執行代碼、符號表等等,而對於導入庫而言,其實際的執行代碼位於動態庫中,導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。
如:當我們在自己的程序中引用了一個h頭文件裏的函數,鏈接器怎麼知道該調用哪個DLL文件呢?
這就是導入庫文件的作用:告訴鏈接器調用的函數在哪個DLL中,函數執行代碼在DLL中的什麼位置。這也就是爲什麼需要在工程屬性的“附加依賴項”中填入.LIB文件,它起到橋樑的作用。如果生成靜態庫文件,則沒有DLL ,只有lib,這時函數可執行代碼部分也在lib文件中。
dll有兩種加載方式:隱式鏈接和顯式鏈接。
dll一般會有對應的導入庫,方便程序進行隱式鏈接加載,否則就需要自己LoadLibary調入DLL文件,然後再GetProcAddress獲得對應函數了(即顯示鏈接加載dll方式)。有了導入庫,你只需要鏈接導入庫後按照頭文件函數接口的聲明調用函數就可以了。
即:隱式鏈接方式需要導入庫,而顯式鏈接方式可以不需要。
.h頭文件是編譯時必須的,lib庫是鏈接時需要的,dll動態鏈接庫是運行時需要的。
若生成了DLL,則肯定也生成 LIB文件。如果要完成源代碼的編譯和鏈接,有頭文件和lib就夠了。如果也使動態連接的程序運行起來,有dll就夠了。在開發和調試階段,當然最好都有。