什麼是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
沒有留言:
張貼留言