此篇僅作簡要的記錄,作為備忘。
更為詳細的可以參考:[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...