靜態鏈接是指把要調用的函數或者過程直接鏈接到可執行文件中,成為可執行文件的一部分。也就是函數和過程的代碼就在程序的可執行文件中,可執行文件包含了運行時所需的全部代碼。
動態鏈接是指所調用的函數代碼并沒有被拷貝到應用程序的可執行文件中去,而是僅僅在其中加入了所調用函數的描述信息,往往是一些重定位信息。僅當應用程序被裝入內存開始運行時,在操作系統的管理下,應用程序與相應的動態鏈接庫(dynamic link library,dll)之間建立鏈接關系,當要執行所調用dll中的函數時,根據鏈接產生的重定位信息,操作系統才轉去執行dll中相應的函數代碼。
靜態鏈接的優點是執行程序能夠在其他同類操作系統的機器上直接運行。缺點是當多個程序都調用相同函數時,內存中就會存在這個函數的多個拷貝,這樣就浪費了內存資源。動態鏈接的執行程序則不能夠在其他同類操作系統的機器上直接運行,除非把該exe文件所需的dll文件都一起拷貝過去,或者對方機器上也有所需的相同版本的dll文件,否則是不能保證正常運行的。
靜態鏈接庫就是使用的.lib文件,庫中的代碼最后需要鏈接到可執行文件中去,所以靜態鏈接的可執行文件一般比較大一些。
動態鏈接庫是一個包含可由多個程序同時使用的代碼和數據的庫。可執行程序(如.exe文件或.dll文件)在運行時加載動態鏈接庫,即將程序所需的動態鏈接庫映射到調用進程的地址空間。
靜態鏈接庫和動態鏈接庫的相同點是它們都實現了代碼的共享。不同點是靜態鏈接庫lib中的代碼被包含在調用的exe文件中,該lib中不能再包含其他動態鏈接庫或者靜態鏈接庫了。動態鏈接庫dll可以被調用的exe動態地“引用”和“卸載”,該dll中可以包含其他動態鏈接庫或者靜態鏈接庫。