建立及使用DLL

2021-08-27 19:25:56 字數 1901 閱讀 4955

此篇僅作簡要的記錄,作為備忘。

更為詳細的可以參考:[url]

[url]

ms關於dll的文件目錄:[url]

[color=blue][size=large]1、dll的建立[/size][/color]

官方文件:[url]

在vs中新建dll工程,定義

#pragma once

#ifdef createdll_exports

#define createdll_api __declspec(dllexport)

#else

#define createdll_api __declspec(dllimport)

// check windows

#if _win32 || _win64

#if _win64

#pragma comment(lib,"lbfgs_alglibdllx64.lib")

#else

#pragma comment(lib,"lbfgs_alglibdllx86.lib")

#endif

#endif

#endif

接下來,我們在建立dll的工程中定義[b]createdll_api[/b],方法為:在工程屬性頁面下圖所示位置加上createdll_api:

[img]

對於需要匯出的函式(宣告和定義兩處都要),要這麼寫:

createdll_api int funca(int a=1);

由於定義了[b]createdll_api[/b],相當於宣告了:

__declspec(dllexport) int funca(int a=1);

表明我們現在是要匯出該函式funca。寫好函式後就可以編譯了。

編譯好之後,會生成 對應的lib檔案和dll檔案。

[color=blue][size=large]2、dll的使用[/size][/color]

[color=red]注意:[/color]程式執行時需要將dll拷貝到程式所在目錄,或者將dll目錄新增到環境變數path中(新增完成後需要重啟)。

[url]

將之前寫的標頭檔案加入工程,該工程不要定義[b]createdll_api[/b]。

將生成的lib檔案所在路徑新增到工程的libarary directory中就可以編譯了。

這裡想多說一點的是:如果按我上面的標頭檔案寫法,編譯器會自動選擇對應的lib檔案。無需在工程屬性的linker->input下手動輸入要引入的lib檔案了。

當然,前提是需要手動將dll工程的輸出dll檔名進行更名,64位版本加了x64字尾,32位版本加了x86字尾。如下圖所示:

[img]

[url]

參考官方文件或者之前給出的博文吧!

過程主要為:

loadlibray 載入dll

getprocaddress 獲取函式位址

使用函式控制代碼

freelibrary 釋放dll資源

[color=blue][size=large]3、檢視dll中經過修飾的函式名[/size][/color]

[url]

c++中會對函式名進行修飾,如果用顯式鏈結,直接使用原始函式名會出現問題!

可以通過dumpbin工具進行檢視:

方法為,從開始選單中開啟[color=red][b]vs的command prompt[/b][/color],在命令列環境下輸入以下命令,就可以看到匯出的函式名了:

dumpbin /exports ./x64/release/lbfgs_alglibdllx64.dll

由於我使用隱式呼叫,這裡不再深究

dll的建立及使用(原始碼)

本文出自 http blog.csdn.net closeall2008 dll的建立 下面用 例項簡單的介紹一下如何建立dll以及如何使用dll。1 首先建立乙個dll的標頭檔案。dll的原始碼檔案 cpp 需要包含這個標頭檔案,而且使用這個動態連線庫的可執行檔案也需要這個標頭檔案。這個標頭檔案包...

建立DLL函式及其使用DLL

如果想要匯出乙個全域性函式,就用關鍵字來宣告 declspec dllexport 注意 這是vc自己特有的關鍵字,在linux下不可用。declspec dllexport int add int a,int b return a b 配置生成my.dll和my.lib檔案 在main.cpp中 ...

C 建立dll檔案及使用方法

一 dll的建立 建立專案 win32 win32專案,名稱 dlltest,應用程式型別選擇dll,不要去掉預編譯頭 新增新建項標頭檔案dlltest.h,如下 ifndef dlltest h define dlltest h ifdef mylibdll define mylibdll ext...