靜態庫與動態庫剖析

2021-06-17 18:59:03 字數 1443 閱讀 9113

靜態庫:

是用namespace包括的類或 函式,也可以有變數(不推薦有)

聲名引入編碼:引入標頭檔案來聲名,聲名後便可以在標頭檔案中使用,

動態庫:

可以使用namespace包含庫頭,匯出的要有_declspec(dllexport) 聲名,生成的lib僅有_declspec(dllexport)名聲的介面會鏈結,同時dll的lib中用乙個dllmain會鏈結進入

程式中,dllmain實現初使化dll,導會函式也只是鏈結跳到位置。

定位址才跳轉。

關於顯示呼叫和隱式呼叫,亦可以說是靜態呼叫和動態呼叫,乙個是編譯器loadliabrary,乙個是你自己loadlibrary

隱式呼叫原理是 由編譯器載入dll確定位址後計算出函式跳轉位址生成lib檔案,直接鏈結lib檔案跳轉到函式。 編譯器自動新增一段loadlibrayr**並查出所在匯出函式的

跳轉位址。vs2010的的延遲載入是使用到時載入,若不延遲載入則程式是一開始便載入不管是否使用到。

顯式呼叫用 是程式設計師用loadbrary載入查詢它的位置。

都要linker #pragma(lib,***):

vs2010  中隱式呼叫,設定延遲dll 也可以通過#pragma 設定使

延遲載入dll:

使用目的:如果在win2000中設計的程式使用了win98沒有的新函式,而要在98上執行,如果不應有延遲載入技術,將會終止程序。

方法(兩步): 1、

常規建立dll和可執行模組; 2、

a)         /lib: delayimp.lib   // 需要delayimp.lib庫(

b)        /delayload: mydll.dll

///

// 實踐:把下面的**新增給需要此功能的模組

u       #include // 需要的標頭檔案

u       #pragma comment(lib, "delayimp.lib") // 庫

u       #pragma comment(linker, "/delayload:delayloadlib.dll") // 延遲載入的庫

u       #pragma comment(linker, "/delay:unload") // 可以手工解除安裝,可選

u       //#pragma comment(linker, "/delay:nobind") // 不繫結,通常不要!

///

情況如下: 使用到時vs2010自己loadlibrary進入;

自己loadlibrary 和freelibrary

靜態庫與動態庫

linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...

靜態庫與動態庫

庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...

靜態庫與動態庫

1.靜態庫 工程在呼叫靜態庫時,複製靜態庫,源 加長,不節省程式空間。字尾名.a 優點 程式設計後不需要再依賴庫 以空間換時間 建立靜態庫 gcc c 原始檔.c ar rcs rcu 靜態庫名 目標檔案1 目標檔案2 rc 靜態庫不存在,就建立該庫檔案 s 更新靜態庫 使用 gcc o file ...