動態庫和靜態庫的區別:靜態庫在程式的鏈結階段被複製到了程式中,和程式執行的時候沒有關係;動態庫在鏈結階段沒有被複製到程式中,而是程式在執行時由系統動態載入到記憶體中供程式呼叫。使用動態庫的優點是系統只需載入一次動態庫,不同的程式可以得到記憶體中相同的動態庫的副本,因此節省了很多記憶體。
正是由於動態庫是在執行的時候載入到程式中,而不是像靜態庫在程式生成的時候就已經複製到了程式中,因此動態庫需要配置環境變數,或者將dll複製到windows system32中或者將dll放在exe執行檔案的同一級目錄下。對於靜態庫,呼叫函式的**封裝在lib中,函式的介面在標頭檔案裡;對於動態庫dll,呼叫函式的**封裝在dll中,函式的介面檔案在標頭檔案裡,但對於動態庫,在生成的過程中,也會產生lib檔案,動態庫的lib檔案是封裝了函式的呼叫位址和其它的記憶體資訊。
接下來講講生成動態庫,開啟vs,同樣新建專案-動態庫,在附加選項裡改為空專案。接著對專案進行配置,動態庫沒有執行時選項,因為對於動態庫的**生成也必須為mt,在鏈結器裡可以配置附加庫目錄和附加依賴項,這裡的鏈結庫依賴項自動為是,不用改。接著配置第三方庫的標頭檔案。
接下來配置完成後就可以編寫動態庫的方法了,具體**編寫的注意事項參考靜態庫的製作過程,對於在標頭檔案中定義函式介面的地方需要在前面新增
_declspec(dllexport)輸出動態庫函式宣告。
cpp檔案中**如下:
#include#include"lxdll.h"
using namespace std;
//函式的實現
char* getname(char* name)
在h檔案中**如下:
#pragma once
//動態庫匯出函式的宣告
_declspec(dllexport) char* getname(char* name);
然後生成,會在release目錄下生成c++dll.dll和c++dll.lib兩個檔案,然後再加上標頭檔案c++dll.h,有這三個檔案就是乙個完整的動態庫。
接下就是使用動態庫了,新建專案,c++**生成選擇md,模式為release,首先先新建乙個cpp檔案,執行得到release目錄,因為這裡想採用匯入動態庫dll直接複製到exe檔案這個目錄下。當然也可以配置環境變數或者放入system32中。將c++dll.dll複製到release目錄下,將標頭檔案c++dll.h和
c++dll.lib複製到程式目錄裡,然後引入標頭檔案,引入lib目錄,因為檔案都複製過來了,因此不需要配置附加包含目錄和附加庫目錄,只需要定義附加依賴項即可,附加依賴項為c++dll.lib。然後就可以直接呼叫標頭檔案裡的函式。
下面為呼叫的**:
#include//dll庫標頭檔案
#include"lxdll.h"
using namespace std;
int main()
下面為兩個工程的檔案:
如果將c++的dll提供給其它語言呼叫,例如c#、python,那麼就使用下面的方式。
標頭檔案
#pragma once
/*如果匯出函式供c++呼叫 前面只需要加__declspec(dllexport)
因為c++允許函式過載,因此函式重名也可以
但其它語言例如c#、python就不行
所以採用c語言的函式明明規則extern "c" __declspec(dllexport)
使用def檔案前面這些都可以不要extern "c" __declspec(dllexport)
一般c++的預設呼叫方式__cdecl,需要呼叫方對函式清棧道
而其它語言無法請棧,因此對外提供api時還應該將介面宣告為__stdcall,讓api函式自己清棧
winapi就死__stdcall
*/int __stdcall myadd
(int a,
int b)
;
原始檔
#include
"lxdll.h"
#include
using
namespace std;
int __stdcall myadd
(int a,
int b)
def檔案
;冒號用來def檔案中注釋一行
;匯出函式
library
exports
myadd @ 1
生成的dll用檢視工具檢視效果如下:
vs2015編譯 pybind 動態庫
本人總結 pyd的檔案 引用 module的名字和 pybind定義的module名字一致,pybind11 module pyiotsdk,m pybind只需要引用標頭檔案即可。根據原文,加上自己的總結 也可以參考 建立visual sdudio 至少2015 win 32 console工程,...
VS2015靜態庫與動態庫的使用
靜態庫建立 略 往往我們使用第三方的比較常見,如果要自己團隊間建立使用也很簡單 標頭檔案的載入 庫檔案的載入 首先需要將 lib同樣拷貝到專案目錄下 方式一 使用 pragma comment lib,lib include stdafx.h include consollib.h include ...
VS2015靜態庫與動態庫的使用
標頭檔案的載入 庫檔案的載入 首先需要將 lib同樣拷貝到專案目錄下 方式一 使用 pragma comment lib,lib include stdafx.h include consollib.h include pragma comment lib,consollib.lib int mai...