(轉載 來自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的運行就不在需要靜態鏈接庫了,可以獨立運行了。
一般的靜態編譯可以理解為加載靜態鏈接庫;動態編譯理解我加載動態鏈接庫。
靜態鏈接庫中不能包含其他庫,動態鏈接庫中能包含其他庫。