靜態鏈接與動態鏈接

      靜態鏈接是由連接器在鏈接時將庫的內容加入到可執行程序中的做法,全部內容都放到同一個可執行文件中。

      靜態鏈接使得不同的程序開發者和部門能夠相對獨立地開發和測試自己的程序模塊,從某種意義上來講大大促進了程序的開發效率,原先限制程序的規模也隨之擴大。但是慢慢地靜態鏈接的諸多缺點也逐步暴露出來,比如浪費內存和磁盤空間、模塊更新困難等問題

      靜態鏈接的最大缺點是生成的可執行文件太大,需要更多的系統資源,在裝入內存時也會消耗更多的時間。

 

      動態鏈接不是並不在執行前將整個程序生成一個可執行文件

      在可執行文件裝載時或運行時,由操作系統的裝載程序加載庫。大多數操作系統將解析外部引用(比如庫)作爲加載過程的一部分。在這些系統上,可執行文件包含一個叫做import directory的表,該表的每一項包含一個庫的名字。根據表中記錄的名字,裝載程序在硬盤上搜索需要的庫,然後將其加載到內存中預先不確定的位置,之後根據加載庫後確定的庫的地址更新可執行程序。可執行程序根據更新後的庫信息調用庫中的函數或引用庫中的數據

      可以動態鏈接的庫,在Windows上是dynamic link library (DLL),在UNIX或Linux上是Shared Library。庫文件是預先編譯鏈接好的可執行文件,存儲在計算機的硬盤上。大多數情況下,同一時間多個應用可以使用一個庫的同一份拷貝,操作系統不需要加載這個庫的多個實例

   

 

 

windows下 靜態鏈接庫的使用方法(注意引用靜態鏈接庫的語句時  programs comment(lib,"靜態庫的名字"))

 
靜態鏈接是指將一個或多個靜態鏈接庫(.lib文件)在Link時期和調用該庫的程序一起形成exe文件。網上關於靜態鏈接庫的理論敘述多且詳盡,我就不再造輪子了,此處僅說明一下具體的使用方法。
創建一個lib的過程很簡單,如:
Windows下靜態鏈接庫的使用
Windows下靜態鏈接庫的使用
在項目中添加Func.h和Func.cpp文件:
Windows下靜態鏈接庫的使用
Windows下靜態鏈接庫的使用

其中分別是示例函數add的聲明和實現。
編譯之後,得到
Windows下靜態鏈接庫的使用
接下來就是如何使用這個靜態鏈接庫了。
新建一個控制檯程序UseLibTest,如下:
Windows下靜態鏈接庫的使用

使用靜態鏈接庫需要兩個條件:
1)擁有靜態庫對應的頭文件,此處爲Func.h;
2)導入Lib文件,此處爲MyLibTest.lib;
將Func.h和MyLibTest.lib放入到UseLibTest的源代碼所在目錄下(P.S:對win32工作目錄沒啥瞭解,嘗試過把Lib文件放到Debug文件夾裏,編譯器表示找不到,放到源代碼目錄下卻神奇地可以找到),並在源代碼中添加這樣一行代碼:
Windows下靜態鏈接庫的使用
這是一條預編譯指令,從這條指令上也可看出,靜態鏈接庫中的代碼在編譯時是和主程序一起編譯的。
編譯UseLibTest並運行,結果如下:
Windows下靜態鏈接庫的使用
靜態鏈接庫使用成功!Windows下靜態鏈接庫的使用

注意靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫 ,而在動態鏈接庫中還可以再包含
發佈了32 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章