2017年8月26日 星期六

使用Visual Studio 2015 C++建立dll檔 ─ dll檔的建立

什麼是dll?

dll是 Dynamic-Link Library的縮寫,中文翻譯為「動態連結函式庫」,在windows 的環境下,副檔名是「.dll」;在linux的環境下,副檔名是「.xo」。dll檔的概念有點像是函式,但與函式不同,函式在編譯時就會一起被編譯,而dll檔是在程式之外的函式,在程式執行的階段若有用到dll中的函式,dll檔才會被載入、執行。[1]
使用dll檔可以節省應用程式所需的磁碟的大小及記憶體空間,而且移植性高,有利於將程式模組化,若有其他支程式需要用到dll檔中的函式,載入dll檔即可。dll檔還有另一個作用,就是可以隱藏函式細節,如果有人要某個功能,可以只將dll檔給對方,並將函式接口告訴對方,而對方無法一窺作者的寫法。



建立dll檔

step 1.  打開VS 2015並新增一個專案。

step 2.選擇「Win32 -> Win32 主控台應用程式」,並將專案名稱命名為DllTest。

step 3. 接下來會跳出一個Win32 應用程式精靈視窗,直接按下「下一步」。


step 4. 在「應用程式類型」的地方,選擇「DLL」後按下「完成」。

Step 5.在方案總管中的專案名字上按「右鍵 -> 加入 -> 新增項目」,新增一個cpp檔DllTest.cpp(名稱請自取),如下面第二張圖。
新增項目
新增一個DllTest.cpp檔

step 6. 重複step 5. 新增一個與cpp檔同名的標頭檔(.h)。

step 7. 請在標頭檔加入以下程式碼

#ifndef  DLLTEST_DLL
#define DLL_PORT __declspec(dllexport)
#else
#define DLL_PORT __declspec(dllimport)
#endif

接著宣告dll中要開放的函式
DLL_PORT int add(int x, int y);
DLL_PORT int sub(int x, int y);
DLL_PORT int dev(int x, int y);
DLL_PORT int mul(int x, int y);

宣告完成後,DllTest.h如下圖

包在#ifdef 中的程式碼,代表若没有定義過DLLTEST_DLL 這個常數,就將DLL_PORT 定義成 _declspec(dllexport);反之,如果定義過DLLTEST_DLL 這個常數,就將DLL_PORT 定義成 _declspec(dllimport)因為在編譯dll檔時並没有定義過DLLTEST_DLL這個常數,所以編譯器會將DLL_PORT解讀成_declspec(dllexport)並編譯dll檔,將函式輸出;在引用dll檔的時候,則會將DLL_PORT解讀成_declspec(dllimport)使用之。[2]

step 8. 再來,在cpp檔中定義函式。


// DllTest.cpp : 定義 DLL 應用程式的匯出函式。
//

#include "stdafx.h"
#include "DllTest.h"

DLL_PORT int add(int x, int y)
{
 return x + y;
}

DLL_PORT int sub(int x, int y)
{
 return x - y;
}
DLL_PORT int dev(int x, int y)
{
 return x / y;
}

DLL_PORT int mul(int x, int y)
{
 return x * y;
}

注意,上面這些程式碼是寫在與.h檔同名的cpp檔中,不是寫在dllmain.cpp中喔,dllmain.cpp的作用有很多,像是可以用來初始化dll檔,dllmain.cpp的使用可以寫成一篇文章了,當然我們也可以不實作它,筆者這篇文章建立dll的方式就是不實作dllmain.cpp。
step 9. 最後建置專案就可以囉!

不過要注意喔,如用幾位元的組態編譯,使用的專案就只能用幾位元的組態編譯,以筆者建立的專案為例,筆者是以x64的組態編譯,因此筆者若要引用這個dll,筆者引用的專案也要是x64。

編譯好的dll檔,可以在專案的資料夾下的「x64->Debug」資料夾中找到。


以上是dll檔的建立方法,下一篇文章,就來介紹dll檔的引用。

參考資料:
[1] wiki - 動態連結函式庫
https://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93

[2] Thinking and Coding - dll檔的製作及使用
http://johnniebooks.blogspot.tw/2010/12/dll.html

其他參考資料:
1.vince學習筆記 - C\C++製做DLL教學
http://vincecc.blogspot.tw/2013/10/cc-dll.html
 







沒有留言:

張貼留言