動態鏈接庫與靜態鏈接庫


代碼分發方式

image

動態庫與靜態庫唯一的區別就是動態庫多了個dll文件

庫的作用

  • 代碼解耦、重用
  • 對外提供服務(export)
  • 典型應用:exe調用dll。我們打開軟件目錄一堆dll,少量exe就是這個道理

對於小軟件,它會把代碼都寫到exe里面,但是大軟件代碼是需要重用的。

以火絨安全為例:

image

庫的分類(形式)

  • 靜態庫:與exe打包成exe(一個文件),windows就是.lib文件
    linux就是.a文件
    它們在調用時會與它們的調用者.exe打包成一個.exe
    【其實windows會變成pe可執行文件,linux是.elf可執行文件,這里為了方便理解這么說】

  • 動態鏈接庫(共享庫)
    與exe是獨立的2個文件
    windows就是.dll文件
    linux就是.so文件

動態庫就是當你調用dll文件的時候,別人也可以調用,也就是說是可以重用的,而靜態庫是不可以的。

靜態庫與動態庫的區別

  • 靜態庫
    1、優點:代碼合並到模塊中,無零散文件。
    2、缺點:模塊體積變大,當多個模塊使用該庫時,內存中有多份代碼。

image

  • 動態庫
    1、優點:模塊體積幾乎不變,當多個模塊使用該庫時,內存中只存在一份代碼。
    2、缺點:代碼在單獨文件中,有零散文件。

image

總結:
    靜態庫的代碼有改動時,所有依賴它的文件都要重新編譯。動態庫不用(某些更改),可以只更新動態庫文件(.dll文件)。

C/C++到可執行程序的過程

image

靜態庫配置方法

image

首先我們編譯好了一份靜態庫文件,只有.h文件和.lib文件

image

lib文件使用方式有兩種,第一種是最簡單的,一般自己做練習的時候使用比較好,但是如果這樣配置庫的話並不會很方便,它會使你的代碼顯得雜亂。

第一種:

通過代碼#include ".h文件絕對路徑",然后通過#pragma comment(lib,"lib文件絕對路徑")來引用lib文件

StabicLib.h代碼:(返回兩個數之和)

#pragma once
int Add(int a,int b)

主程序代碼:

#include <windows.h>
#include <iostream>
#include ".h文件絕對路徑"
#pragma comment(lib,"lib文件絕對路徑")

using namespace std;

int main()
{
    cout << Add(1,1) << endl;
    return 0;
}

運行結果:(返回值2)

image

第二種:【推薦】

我們點擊項目->屬性,然后步驟如下

image

我們在這里寫下頭文件的目錄(只需寫到文件夾路徑,不需寫到文件路徑)

image

然后頭文件就配置好了

接下來是lib文件,lib文件是給鏈接器看的,我們需要配置它的目錄

image

同理,在這里填上lib文件夾路徑

image

然后還需要在輸入->附加依賴項中寫上lib文件的名字

image

這樣就配置好了,但是需要注意這里的配置是要和項目配合使用的
Debug配Debug,X86配Win32

然后接下來我們就可以像正常使用別的庫一樣,使用它

代碼:

#include <windows.h>
#include <iostream>
#include <StaticLib.h>

using namespace std;

int main()
{
    cout << Add(1,1) << endl;
    return 0;
}

然后就可以正常運行了

image

動態庫配置方法

image

主體流程基本差不多,只是多了個dll文件的配置

可以看到這里有三個文件

image

.h文件和.lib文件與靜態相同這里就不再演示【Dll.dll文件我們不需要配置】

我們需要注意要把dll文件復制到項目編譯后的項目文件夾里

image

代碼:

#include <windows.h>
#include <iostream>
#include <Dll.h>

using namespace std;

int main()
{
    cout << Add(1,1) << endl;
    return 0;
}

運行:

image

注意:
    動態庫的特點是需要dll文件與exe文件在一起或者是在一些特定的dll搜索路徑下即可。

衍生技術

黑客hook dll:代碼替換或叫代碼劫持

就是說本來你這個程序是調用一個什么什么dll里面的一個什么什么函數來實現一個什么什么功能,黑客通過分析你的PE格式或者elf格式發現了,然后就寫了一個dll格式的文件,里面也准備了一個什么什么函數,然后替換你原來里面的dll文件|so文件,然后你調用的時候執行的就是黑客准備好的代碼,這個就叫做代碼劫持。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM