天天看點

vs2019生成動态連結庫

封裝的原則:隐藏ffmpeg和sdl的實作

當隻引用其中庫中變量和函數的指針,而不使用其内部的實作,就無需引用頭檔案,隻要前面加一下聲明即可。

1. 動态庫與靜态庫

項目會在在win中示範,但終要跨平台

.lib和.dll的差別

為什麼項目使用動态庫而非靜态庫?

vs2019生成動态連結庫
vs2019生成動态連結庫

linux和windows動态庫的路徑:Linux需要定義查詢.so的路徑,windows可以自定義路徑,也可以直接放在.exe下面

2. 動态連結庫的生成

win要編譯成動态庫的函數需要加上__declspec

__declspec是Microsoft VC中專用的關鍵字,它配合着一些屬性可以對标準C/C++進行擴充。__declspec關鍵字應該出現在聲明的前面。

__declspec(dllexport)用于Windows中的動态庫中,聲明導出函數、類、對象等供外面調用,省略給出.def檔案。 即将函數、類等聲明為導出函數,供其它程式調用,作為動态庫的對外接口函數、類等。

.def檔案(子產品定義檔案)是包含一個或多個描述各種DLL屬性的Module語句的文本檔案。.def檔案或__declspec(dllexport)都是将公共符号導入到應用程式或從DLL導出函數。如果不提供__declspec(dllexport)導出DLL函數,則DLL需要提供.def檔案。

** __declspec(dllimport)用于Windows中,從别的動态庫中聲明導入函數、類、對象等供本動态庫或exe檔案使用。**當你需要使用DLL中的函數時,往往不需要顯示地導入函數,編譯器可自動完成。不使用__declspec(dllimport)也能正确編譯代碼,但使用__declspec(dllimport)使編譯器可以生成更好的代碼。 編譯器之是以能夠生成更好的代碼,是因為它可以确定函數是否存在于DLL中,這使得編譯器可以生成跳過間接尋址級别的代碼,而這些代碼通常會出現在跨DLL邊界的函數調用中。聲明一個導入函數,是說這個函數是從别的DLL導入。一般用于使用某個DLL的exe中。

window桌面程式相當可以生成一些宏來判斷是export庫還是import庫

// 下列 ifdef 塊是建立使從 DLL 導出更簡單的宏的标準方法。
// 此 DLL 中的所有檔案都是用指令行上定義的 XCODEC_EXPORTS符号編譯的。
// 在使用此 DLL 的任何項目上不應定義此符号。
// 這樣,源檔案中包含此檔案的任何其他項目
// 都會将XCODEC_API 函數視為是從 DLL 導入的,而此 DLL 則将用此宏定義的符号視為是被導出的。
#ifdef WIN32			//若是Windows
#ifdef XCODEC_EXPORTS	//若是導出
#define XCODEC_API __declspec(dllexport)	//導出
#else
#define XCODEC_API __declspec(dllimport)	//導入
#endif
#else	//若不是windows
#define XCODEC_API	//定義為空
#endif
           

建立工程時,預設已經定義了導出export了

vs2019生成動态連結庫
vs2019生成動态連結庫
vs2019生成動态連結庫

3. 使用動态連結庫

vs2019生成動态連結庫
vs2019生成動态連結庫

繼續閱讀