代碼分發方式

動態庫與靜態庫唯一的區別就是動態庫多了個dll文件
庫的作用
- 代碼解耦、重用
- 對外提供服務(export)
- 典型應用:exe調用dll。我們打開軟件目錄一堆dll,少量exe就是這個道理
對於小軟件,它會把代碼都寫到exe里面,但是大軟件代碼是需要重用的。
以火絨安全為例:

庫的分類(形式)
-
靜態庫:與exe打包成exe(一個文件),windows就是.lib文件
linux就是.a文件
它們在調用時會與它們的調用者.exe打包成一個.exe
【其實windows會變成pe可執行文件,linux是.elf可執行文件,這里為了方便理解這么說】 -
動態鏈接庫(共享庫)
與exe是獨立的2個文件
windows就是.dll文件
linux就是.so文件
動態庫就是當你調用dll文件的時候,別人也可以調用,也就是說是可以重用的,而靜態庫是不可以的。
靜態庫與動態庫的區別
- 靜態庫
1、優點:代碼合並到模塊中,無零散文件。
2、缺點:模塊體積變大,當多個模塊使用該庫時,內存中有多份代碼。

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

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

靜態庫配置方法

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

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)

第二種:【推薦】
我們點擊項目->屬性,然后步驟如下

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

然后頭文件就配置好了
接下來是lib文件,lib文件是給鏈接器看的,我們需要配置它的目錄

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

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

這樣就配置好了,但是需要注意這里的配置是要和項目配合使用的
Debug配Debug,X86配Win32
然后接下來我們就可以像正常使用別的庫一樣,使用它
代碼:
#include <windows.h>
#include <iostream>
#include <StaticLib.h>
using namespace std;
int main()
{
cout << Add(1,1) << endl;
return 0;
}
然后就可以正常運行了

動態庫配置方法

主體流程基本差不多,只是多了個dll文件的配置
可以看到這里有三個文件

.h文件和.lib文件與靜態相同這里就不再演示【Dll.dll文件我們不需要配置】
我們需要注意要把dll文件復制到項目編譯后的項目文件夾里

代碼:
#include <windows.h>
#include <iostream>
#include <Dll.h>
using namespace std;
int main()
{
cout << Add(1,1) << endl;
return 0;
}
運行:

注意:
動態庫的特點是需要dll文件與exe文件在一起或者是在一些特定的dll搜索路徑下即可。
衍生技術
黑客hook dll:代碼替換或叫代碼劫持
就是說本來你這個程序是調用一個什么什么dll里面的一個什么什么函數來實現一個什么什么功能,黑客通過分析你的PE格式或者elf格式發現了,然后就寫了一個dll格式的文件,里面也准備了一個什么什么函數,然后替換你原來里面的dll文件|so文件,然后你調用的時候執行的就是黑客准備好的代碼,這個就叫做代碼劫持。
