靜態編譯、動態編譯、靜態鏈接庫、動態鏈接庫

(轉載 來自https://www.cnblogs.com/lisuyun/p/3953589.html)

1.靜態編譯:
編譯器在編譯可執行文件時,把需要用到的對應動態鏈接庫(.so或.ilb)中的部分提取出來,鏈接到可執行文件中去,
使可執行文件在運行時不需要依賴於動態鏈接庫.
2.動態編譯:
動態編譯的可執行文件需要附帶一個的動態鏈接庫,在執行時,需要調用其對應動態鏈接庫中的命令。所以其優點一
方面是縮小了執行文件本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程序,只用到了鏈接
庫中的一兩條命令,也需要附帶一個相對龐大的鏈接庫;二是如果其他計算機上沒有安裝對應的運行庫,則用動態編譯的可執行文
件就不能運行。

靜態編譯:
      靜態lib將導出聲明和實現都放在lib中。編譯後所有代碼都嵌入到宿主程序。
動態編譯:
      動態lib相當於一個h文件,是對實現部分(.dll文件)的導出部分的聲明。編譯後只是將導出聲明部分編譯到宿主程序中,運行時
      候需要相應的dll文件支持。

動態鏈接庫:
創建一個動態鏈接庫,會生成x.dll,x.lib
動態鏈接庫有兩種加載方式:
     1.一種是靜態加載,就是在編譯的時候就載入動態鏈接庫。此種方法可調用類方法.
           可執行程序靜態加載動態鏈接庫需要三個文件 x.dll, x.lib, x.h
           可執行程序的頭文件加入:
            #include “x.h”
    #pragma comment(lib,“x.lib”)
           編譯時還要附加庫目錄,防止程序編譯時無法找到x.dll。
     2 .動態加載
   只需要x.dll文件。
   在程序執行需要該動態鏈接庫的地方加載x.dll。
   然後獲取需要的x.dll庫裏面的函數或數據.
   該方法不能調用類方法.
  可執行程序調用了動態鏈接庫,其運行不能缺少動態鏈接庫.

靜態鏈接庫:
  創建一個靜態鏈接庫,會生成x.lib文件
  想要調用靜態鏈接庫裏面的內容需要x.lib文件和x.h文件
  庫中內容會直接編譯到x.exe文件中。
  可執行程序使用靜態庫編譯成x.exe後,x.exe的運行就不在需要靜態鏈接庫了,可以獨立運行了。
 
 一般的靜態編譯可以理解爲加載靜態鏈接庫;動態編譯理解我加載動態鏈接庫。
 靜態鏈接庫中不能包含其他庫,動態鏈接庫中能包含其他庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章