cnsl是什么意思_VS2010下创建静态链接库和动态链接库
VS2010下創建靜態鏈接庫和動態鏈接庫
類封裝成dll如果你的工作長期與某個領域相關,比如說長期做直接體繪制 (DVR)方面的開發,那么你可能經常使用自己的傳遞函數類,如果每一個工程你都把傳遞函數類的.h和.cpp文件添加進去會比較麻煩,其實,我們可以像 使用opengl的庫那樣來用你自己的類,做法就是把你寫好的類封裝成dll,具體做法如下: 第一步:制作dll 利用VC6新建工程時選擇win32 dynamic-Link Library(空的工程),然后添加頭文件和cpp文件。假設你要封裝的類的名成是TransferFunction,添加頭文件 TransferFunction.h和TransferFunction.cpp到工程中。并將TransferFunction.h修改成: class __declspec(dllexport)TransferFunction . 從而說明以后從dll要被導出的類是哪一個。這樣編譯完就會產生TransferFunction.dll和TransferFunction.lib兩個文件。 第二步:如何使用這個dll 當已經生成dll后,有兩種方法可以在其它程序中調用dll中的類和成員函數: 方法一: 1)把TransferFunction.dll和TransferFunction.lib復制到調用程序的執行路徑下,注意不是debug路徑下。 2)在project-setting-link里添加TransferFunction.lib(或者用#pragma comment(lib, TransferFunction.lib) ) 3)把TransferFunction.h中的__declspec(dllexport)改成__declspec(dllimport) 然后復制到調用程序的執行路徑下。 4)最后在主程序中就可以通過包含TransferFunction.h來使用TransferFunction類和它的成員函數。 方法二(推薦): 在方法一中,你每次建立一個工程都需要把 TransferFunction.dll,TransferFunction.lib,TransferFunction.h三個文件拷貝到工程里面 去,事實上這只發揮了dll對類的代碼保護的功能,并沒有多大的減輕編程人員的工作量,下面的方法可以減少編程人員的工作量,具體步驟: undefined1:將TransferFunction.dll扔到windowssystem32下 2:將.TransferFunctionlib扔到VC的lib目錄里 3:將方法一中的TransferFunction.h扔到VC的include目錄里 4:同方法一的最后一步。 以后你就可以像使用Opengl的glut、glui等庫一樣使用你自己封裝的一個經常復用的類了。VS2010下創建靜態鏈接庫和動態鏈接庫 下面介紹一下用VS2010如何創建靜態鏈接庫和動態鏈接庫,并測試創建的庫。1.靜態鏈接庫打開VS2010,新建一個項目,選擇win32項目,點擊確定,選擇靜態庫這個選項,預編譯頭文件可選可不選。 在這個空項目中,添加一個.h文件和一個.cpp文件。名字我們起為static.h和static.cpp static.h文件:cppview plaincopy 1. #ifndef LIB_H2. #define LIB_H3.4. extern C int sum(int a,int b);5.6. #endifstatic.cpp文件:1.#include static.h2.3. int sum(int a,int b) 4. 5. return a+b; 6. 編譯這個項目之后,會在debug文件夾下生成static.lib文件,這個就是我們需要的靜態鏈接庫。下面說明如何調用靜態鏈接庫。首先需要新建一個空項目,起名為test。將之前static項目下的static.h和static.lib這個2個文件復制到test項目的目錄下,并在工程中加入static.h文件。新建一個test.cpp文件如下:cppview plaincopy 1. span style=font-size:14px;#include stdio.h2. #include stdlib.h3. #include static.h4.5. #pragma comment(lib,static.lib)6.7. int main()8. 9. printf(%dn,sum(1,2);第2 / 5頁10. system(pause); 11. return 0;12. 編譯運行可得結果:3 #pragma comment(lib,static.lib),這一句是顯式的導入靜態鏈接庫。除此之外,還有其他的方法,比如通過設置路徑等等,這里不做介紹。2.動態鏈接庫和創建靜態鏈接庫一樣,需要創建一個空的win32項目,選擇dll選項。創建dynamic.cpp和dynamic.h文件dynamic.h文件:cppview plaincopy1. span style=font-size:14px;#ifndef DYNAMIC2. #define DYNAMIC3.4. extern C __declspec(dllexport)int sum(int a, int b);5.6. #endif DYNAMIC/span第3 / 5頁dynamic.cpp文件:cppview plaincopy 1. span style=font-size: 14px; #include dynamic.h 2.3. int sum(int a, int b)4. 5. return a+b;6. /span編譯這個項目,會在debug文件夾下生成dynamic.dll文件。下面介紹如何調用動態鏈接庫,這里講的是顯式的調用。在剛才的test項目下,把static.lib和static.h文件刪除,把dynamic.h和dynamic.dll復制到該目錄下,并在項目中添加dynamic.h文件,修改test.cpp文件為:cppview plaincopy1. span style=font-size:14px;#include stdio.h2. #include stdlib.h3. #includeWindows.h4. #include dynamic.h5. int main()第4 / 5頁6. 7. HINSTANCE hDll=NULL;8. typedef int(*PSUM)(int a,int b);9. PSUM pSum;10. hDll = LoadLibrary(Ldynamic.dll);11. pSum = (PSUM)GetProcAddress(hDll,sum);12. printf(%dn,pSum(1,2);13. system(pause);14. FreeLibrary(hDll);15. return 0;16. 17. /span編譯運行結果為:3特別提示:1.extern C中的C是大寫,不是小寫2.如果從VS2010中直接運行程序,lib和dll需要放到test項目的目錄下;如果想雙擊項目test下的debug文件中的exe文件直接運行的話,需把lib和dll放入debug文件夾下。VS2010下靜態鏈接庫和動態鏈接庫總結尚哥發表于 8月前 (2015-01-28 08:46:16) | 評論(0)| 閱讀次數(1518)|0人收藏此文章, 我要收藏靜態鏈接庫對于靜態鏈接庫是函數庫的情況如下:生成靜態鏈接庫:必須要有頭文件。對于靜態鏈接庫是函數庫的情況如下:.h文件中是函數的聲明,.cpp文件中是函數的實現。舉例:jj測試靜態鏈接庫(1) #include “.h” /編譯時候需要 注意:如果.h文件不在源程序文件同級目錄下,需要配置VS環境:項目屬性-配置屬性-C/C+-常規-附加包含目錄,可以事先將.h文件放到某個位置的lnclude文件夾中,當添加附加包含目錄時候將其定位到該lnclude文件夾。(2) #pragma comment(lib,*.lib) 或者配置VS環境方式引入庫文件.lib,具體項目屬性-配置屬性-鏈接器-輸入-附加依賴項 /鏈接時候需要 注意:如果.lib庫文件不在源程序文件同級目錄下,需要配置VS環境:項目屬性-配置屬性-鏈接器-常規-附加庫目錄,可以事先將.lib文件放到某個位置的lib文件夾中,當添加附加庫目錄時候將其定位到該lib文件夾。舉例:對于動態鏈接庫是函數庫的情況如下:動態鏈接庫生成動態鏈接庫:頭文件可以不要。但一般第三方都會有頭文件,因為如果沒有頭文件,則需要在實現文件中使用函數之前聲明函數,而一般對于用戶來講都是不知道函數聲明的,而且對于一個工程中使用多個導出函數的情況還需要多個函數的聲明比較麻煩,所以實際中還是都有頭文件的。頭文件是函數的聲明,聲明前需要修飾符_declspec(dllexport) 或者extern 也行,如果動態庫是用C語言寫的,就需要寫成 externa “C”的方式。(說明:實際上,當你想導入一個符號時,你不需要用到__declspec(dllimport). 用extern就可以了。但是,如果用__declspec(dllimport)的話,編譯器會生成更有效率的代碼。)實現文件函數前就不再需要修飾符_declspec(dllexport) 等了。測試動態鏈接庫對于提供頭文件的情況:#include .h /路徑問題同靜態鏈接庫頭文件引入 編譯時候需要#pragma comment(lib,*.lib) /路徑問題同靜態鏈接庫庫引入,實際對于動態鏈接庫來講,此時的.lib文件是導入庫。 鏈接時候需要不提供頭文件的情況:不需要寫#include .h ,因為沒有。此時要完成函數聲明功能,需要使用extern int add(int x,int y);來實現函數的聲明或者 _declspec(dllimport) int add(int x,int y)來聲明引入的函數。#pragma comment(lib,*.lib) /路徑問題同靜態鏈接庫庫引入,實際對于動態鏈接庫來講,此時的.lib文件是導入庫。 鏈接時候需要。1.隱式調用 把dlltest.dlldlltest.lib dlltest.h 三個文件考到本地工程目錄下面2.顯示調用動態庫函數 只需要將dlltest.dll文件復制到本地工程目錄下。一般動態鏈接庫的標準寫法如下:VC+ 程序 如何封裝為dll文件VC+分享到:專業回答ljmdzyx0072013-09-13 22:28創建新的動態鏈接庫 (DLL) 項目從 “文件”菜單中,選擇 “新建”,然后選擇 “項目”。在 “項目類型”窗格中,選擇 “Visual C+”下的 “Win32”。在 “模板”窗格中,選擇 “Win32 控制臺應用程序”。為項目選擇一個名稱,如MathFuncsDll,并將其鍵入 “名稱”字段。 為解決方案選擇一個名稱,如DynamicLibrary,并將其鍵入 “解決方案名稱”字段。單擊 “確定”啟動 Win32 應用程序向導。在 “Win32 應用程序向導”對話框的 “概述”頁中,單擊 “下一步”。在 “Win32 應用程序向導”中的 “應用程序設置”頁中,選擇 “應用程序類型”下的 “DLL”(如果可用),或者選擇 “控制臺應用程序”(如果 “DLL”不可用)。 某些版本的 Visual Studio不支持通過使用向導創建 DLL 項目。您可以稍后對此進行更改,以將項目編譯為DLL。在 “Win32 應用程序向導”的 “應用程序設置”頁中,選擇 “附加選項”下的 “空項目”。單擊 “完成”創建項目。向動態鏈接庫添加類若要為新類創建頭文件,請從 “項目”菜單中選擇 “添加新項”。將顯示 “添加新項”對話框。在 “類別”窗格中,選擇 “Visual C+”下的 “代碼”。 在 “模板”窗格中選擇 “頭文件(.h)”。 為頭文件選擇一個名稱,如MathFuncsDll.h,并單擊 “添加”。 將顯示一個空白文件。添加一個名為“MyMathFuncs”的簡單類,以執行常見的算術運算,如加、減、乘和除。代碼應與以下內容類似:以帶有顏色區分的格式查看復制到剪貼板打印/ MathFuncsDll.hnamespace MathFuncsclass MyMathFuncspublic:/ Returns a + bstatic __declspec(dllexport) double Add(double a, double b);/ Returns a - bstatic __declspec(dllexport) double Subtract(double a, double b);/ Returns a * bstatic __declspec(dllexport) double Multiply(double a, double b);/ Returns a / b/ Throws DivideByZeroException if b is 0static __declspec(dllexport) double Divide(double a, double b);/ MathFuncsDll.hnamespace MathFuncsclass MyMathFuncspublic:/ Returns a + bstatic __declspec(dllexport) double Add(double a, double b);/ Returns a - bstatic __declspec(dllexport) double Subtract(double a, double b);/ Returns a * bstatic __declspec(dllexport) double Multiply(double a, double b);/ Returns a / b/ Throws DivideByZeroException if b is 0static __declspec(dllexport) double Divide(double a, double b);請注意此代碼方法聲明中的 __declspec(dllexport) 修飾符。 這些修飾符使 DLL能夠導出該方法以供其他應用程序使用。有關更多信息,請參見 dllexport, dllimport。若要為新類創建源文件,請從 “項目”菜單中選擇 “添加新項”。將顯示 “添加新項”對話框。在 “類別”窗格中,選擇 “Visual C+”下的 “代碼”。 在 “模板”窗格中,選擇 “C+ 文件(.cpp)”。 為源文件選擇一個名稱,如MathFuncsDll.cpp,并單擊 “添加”。 將顯示一個空白文件。在源文件中實現“MyMathFuncs”的功能。代碼應與以下內容類似:以帶有顏色區分的格式查看復制到剪貼板打印/ MathFuncsDll.cpp/ compile with: /EHsc /LD#include MathFuncsDll.h#include stdexceptusing namespace std;namespace MathFuncsdouble MyMathFuncs:Add(double a, double b)return a + b;double MyMathFuncs:Subtract(double a, double b)return a - b;double MyMathFuncs:Multiply(double a, double b)return a * b;double MyMathFuncs:Divide(double a, double b)if (b = 0)throw new invalid_argument(b cannot be zero!);return a / b;/ MathFuncsDll.cpp/ compile with: /EHsc /LD#include MathFuncsDll.h#include stdexceptusing namespace std;namespace MathFuncsdouble MyMathFuncs:Add(double a, double b)return a + b;double MyMathFuncs:Subtract(double a, double b)return a - b;double MyMathFuncs:Multiply(double a, double b)return a * b;double MyMathFuncs:Divide(double a, double b)if (b = 0)throw new invalid_argument(b cannot be zero!);return a / b;若要將項目生成為 DLL,請從“項目”菜單中選擇MathFuncsDll “屬性.”。 在左窗格中,選擇 “配置屬性”下的 “常規”。在右窗格中,將 “配置類型”更改為 “動態庫(.dll)”。單擊 “確定”保存更改。說明如果您從命令行生成項目,請使用/LD 編譯器選項指定輸出文件應為 DLL。有關更多信息,請參見 /MD、/MT、/LD(使用運行庫)。編譯該動態鏈接庫,方法是選擇“生成”菜單中的 “生成解決方案”。這樣就創建了一個可供其他程序使用的DLL。VS2010生成靜態庫(.lib)時間2013-06-17 18:37:46CSDN博客原文http:/blog.csdn.net/ivanljf/article/details/主題Visual Studio動態庫打開VS2010,新建一個項目,選擇win32項目,點擊確定,選擇靜態庫這個選項,預編譯頭文件不選。在這個空項目中,添加一個.h文件和一個.cpp文件。名字我們起為static.h和static.cppstatic.h文件:#ifndef LIB_H#define LIB_Hextern C int sum(int a,int b);extern C int substract(int a,int b); #endifstatic.cpp文件#include static.hint sum(int a,int b)return a+b;int substract(int a,int b)return a-b;編譯這個項目之后(生成生成解決方案),會在debug文件夾下生成static.lib文件,這個就是我們需要的靜態鏈接庫。下面說明如何調用靜態鏈接庫。首先需要新建一個空項目,起名為test。將之前static項目下的static.h和static.lib這個2個文件復制到test項目的目錄下,并在工程中加入static.h文件。新建一個test.cpp文件如下:#include static.h#include stdlib.h#include stdio.h#pragma comment(lib,static.lib)int main()printf(%dn,sum(1,2);printf(%dn,substract(4,3);system(pause);return 0;編譯運行可得結果:31#pragma comment(lib,static.lib),這一句是顯式的導入靜態鏈接庫。除此之外,還有其他的方法,比如通過設置路徑等等,這里不做介紹?;蛘哌x中工程名,點擊右鍵-屬性,在“VC+目錄”的包含目錄里面加入static.h的所在目錄的路徑,庫目錄里面加入static.lib所在目錄的路徑;在鏈接器-輸入-附加依賴項輸入“static.lib”。然后源文件里添加#includestatic.h就OK了。題外話摘自百度百科:程序編譯一般需經預處理、編譯、匯編和鏈接幾個步驟。在我們的應用中,有一些公共代碼是需要反復使用,就把這些代碼編譯為“庫”文件;在鏈接步驟中,連接器將從庫文件取得所需的代碼,復制到生成的可執行文件中。這種庫稱為靜態庫,其特點是可執行文件中包含了庫代碼的一份完整拷貝;缺點就是被多次使用就會有多份冗余拷貝。靜態庫和動態庫是兩種共享程序代碼的方式,它們的區別是:靜態庫在程序的鏈接階段被復制到了程序中,和程序運行的時候沒有關系;動態庫在鏈接階段沒有被復制到程序中,而是程序在運行時由系統動態加載到內存中供程序調用。使用動態庫的優點是系統只需載入一次動態庫,不同的程序可以得到內存中相同的動態庫的復本,因此節省了很多內存。Dll無法直接導出泛型模板(generalizedtemplate),因此,如果要導出stl類,則模板必須先實例化(instantiated)。另外,如果導出的STL類使用了其他STL類,那么這些其他類必須同時被導出。目前stl中唯一能夠被導出的容器是vector,其他容器(如map、set、queue、list、deque)都因包含嵌套類而不能被導出。導出STL類的步驟:在Dll和exe文件中,用同樣版本的c運行庫鏈接。譬如都用Msvcrt.lib(release)鏈接或都用Msvcrtd.lib(debug)鏈接。Dll中,用__declspec(dllexport)導出模板類的實例。在exe文件中,用__declspec(dllimport)和extern關鍵字從Dll中導入stl類。需要注意的是:當導出一個以自定義類為模板參數的stl容器,必須為這個自定義類型定義和=運算符。譬如,如果要導出std:vectorCPerson類,則必須為CPerson添加和=運算符。#ifdefEXP_STL#defineDECLSPECIFIER__declspec(dllexport)#defineEXPIMP_TEMPLATE#else#defineDECLSPECIFIER__declspec(dllimport)#defineEXPIMP_TEMPLATEextern#endif/導出stl類std:vectorCPersonclassCPersonpublic:intm_nAge;charm_strName40;public:booloperator(constCPerson&c)constreturntrue;booloperator=(constCPerson&c)constreturntrue;EXPIMP_TEMPLATEtemplateclassVECDLL_APIstd:vectorCPerson;/顯式實例化模板類VECDLL_APIintfnVecDll(std:vectorCPerson&vecPer);/導出函數定義這兩個運算符的原因是:所有stl容器都有比較成員函數,這些成員函數需要調用自定義類型的和=運算符。通常情況下,由于沒有使用這些成員函數,所以它們沒有被實例化,所以我們使用時一般就不需要為CPerson定義這兩個運算符。然而,當顯示實例化此容器類時,它所有的成員函數都需實例化,包括它的“比較”成員函數,所以這時必須實現CPerson的和=運算符。如果CPerson并不在乎和=的意義,我們可以像上面代碼所示通過簡單返回true來實現它們。導出一個數據成員包含stl對象的類。方法與上類似。如下代碼所示:EXPIMP_TEMPLATEtemplateclassVECDLL_APIstd:vectorint/顯式實例化std:vectorintclassVECDLL_APICContainerpublic:std:vectorintm_vecNum;VS下 dllimport與dllexport作用與區別時間:2014-11-24 18:32:32 閱讀:234 評論:0 收藏:0點我收藏+標簽:desclassstyle代碼使用comlog文件問題我相信寫WIN32程序的人,做過DLL,都會很清楚__declspec(dllexport)的作用,它就是為了省掉在DEF文件中手工定義導出哪些函數的一個方法。當然,如果你的DLL里全是C+的類的話,你無法在DEF里指定導出的函數,只能用__declspec(dllexport)導出類。但是,MSDN文檔里面,對于__declspec(dllimport)的說明讓人感覺有點奇怪,先來看看MSDN里面是怎么說的:不使用 __declspec(dllimport) 也能正確編譯代碼,但使用 __declspec(dllimport) 使編譯器可以生成更好的代碼。編譯器之所以能夠生成更好的代碼,是因為它可以確定函數是否存在于 DLL 中,這使得編譯器可以生成跳過間接尋址級別的代碼,而這些代碼通常會出現在跨 DLL 邊界的函數調用中。但是,必須使用 __declspec(dllimport) 才能導入 DLL 中使用的變量。初看起來,這段話前面的意思是,不用它也可以正常使用DLL的導出庫,但最后一句話又說,必須使用 __declspec(dllimport) 才能導入 DLL 中使用的變量這個是什么意思?那我就來試驗一下,假定,你在DLL里只導出一個簡單的類,注意,我假定你已經在項目屬性中定義了 SIMPLEDLL_EXPORTSimpleDLLClass.h#ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT#endifclass DLL_EXPORT SimpleDLLClasspublic:SimpleDLLClass();virtual SimpleDLLClass();virtual getValue() return m_nValue;private:int m_nValue;SimpleDLLClass.cpp#include SimpleDLLClass.hSimpleDLLClass:SimpleDLLClass()m_nValue=0;SimpleDLLClass:SimpleDLLClass()然后你再使用這個DLL類,在你的APP中include SimpleDLLClass.h時,你的APP的項目不用定義 SIMPLEDLL_EXPORT 所以,DLL_EXPORT 就不會存在了,這個時候,你在APP中,不會遇到問題。這正好對應MSDN上說的__declspec(dllimport)定義與否都可以正常使用。但我們也沒有遇到變量不能正常使用呀。那好,我們改一下SimpleDLLClass,把它的m_nValue改成static,然后在cpp文件中加一行int SimpleDLLClass:m_nValue=0;如果你不知道為什么要加這一行,那就回去看看C+的基礎。 改完之后,再去LINK一下,你的APP,看結果如何,結果是LINK告訴你找不到這個m_nValue。明明已經定義了,為什么又沒有了?肯定是因為我把m_nValue定義為static的原因。但如果我一定要使用Singleton的Design Pattern的話,那這個類肯定是要有一個靜態成員,每次LINK都沒有,那不是完了? 如果你有Platform SDK,用里面的Depend程序看一下,DLL中又的確是有這個m_nValue導出的呀。再回去看看我引用MSDN的那段話的最后一句。 那我們再改一下SimpleDLLClass.h,把那段改成下面的樣子:#ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT __declspec(dllimport)#endif再LINK,一切正常。原來dllimport是為了更好的處理類中的靜態成員變量的,如果沒有靜態成員變量,那么這個__declspec(dllimport)無所謂。_declspec(dllexport)與_declspec(dllimport)都是DLL內的關鍵字,即導出與導入。他們是將DLL內部的類與函數以及數據導出與導入時使用的。主要區別在于,dllexport是在這些類、函數以 及數據的申明的時候使用。用過表明這些東西可以被外部函數使用,即(dllexport)是把DLL中的相關代碼(類,函數,數據)暴露出來為其他應用程 序使用。使用了(dllexport)關鍵字,相當于聲明了緊接在(dllexport)關鍵字后面的相關內容是可以為其他程序使用的。而dllimport關鍵字是在外部程序需要使用DLL內相關內容時使用的關鍵字。當一個外部程序要使用DLL內部代碼(類,函數,全局變量)時,只需要在 程序內部使用(dllimport)關鍵字聲明需要使用的代碼就可以了,即(dllimport)關鍵字是在外部程序需要使用DLL內部相關內容的時候才 使用。(dllimport)作用是把DLL中的相關代碼插入到應用程序中。_declspec(dllexport)與_declspec(dllimport)是相互呼應,只有在DLL內部用dllexport作了聲明,才能 在外部函數中用dllimport導入相關代碼。實際上,在應用程序訪問DLL時,實際上就是應用程序中的導入函數與DLL文件中的導出函數進行鏈接。而 且鏈接的方式有兩種:隱式迎接和顯式鏈接。隱式鏈接是指通過編譯器提供給應用程序關于DLL的名稱和DLL函數的鏈接地址,面在應用程序中不需要顯式地將DLL加載到內存,即在應用程序中使用dllimport即表明使用隱式鏈接。不過不是所有的隱式鏈接都使用dllimport。顯式鏈接剛同應用程序用語句顯式地加載DLL,編譯器不需要知道任何關DLL的信息以下是一個DLL頭文件的正規編寫方式:1 #ifdef DIALOG_MAINMENU_EXPORTS2 #define DIALOG_MAINMENU_API __declspec(dllexport) 3 #else4 #define DIALOG_MAINMENU_API __declspec(dllimport) 5 #endif6 7 class Dialog_MainMenu 8 public:9 static DIALOG_MAINMENU_API enum GAME_STATES 10 MAINMENU, GAME, OPTIONS, CREDITS, QUIT11 ;12 static DIALOG_MAINMENU_API GAME_STATES CurrentGameState;13 DIALOG_MAINMENU_API GAME_STATES GetState();14 ;以下是解釋:OK - when you compile the dll - you are exporting the types. So, you need todefinethe static member in.cppfile of the dll. You also need to make sure that you have enabled the definition ofDIALOG_MAINMENU_EXPORTSin compiler settings. This will make sure types are exported.Now, when you link the console application with the dll - you will#includedlls header and dont enable any definition ofDIALOG_MAINMENU_EXPORTSin compiler settings (just leave the settings default). This will make the compiler understand that now you are importing the typesfromyour dll into exeapplication.C/C+中動態鏈接庫的創建和調用2007-02-05 14:12天極網我要評論(0)字號:T|T本文詳細介紹了動態連接庫的創建步驟和動態鏈接的調用步驟,供大家參考!AD:【線下活動】三大新銳HTML 5企業匯聚51CTO大話移動前端技術動態連接庫的創建步驟:一、創建Non-MFC DLL動態鏈接庫1、打開File New Project選項,選擇Win32 Dynamic-Link Library sample project 工程名:DllDemo2、新建一個.h文件DllDemo.h#ifdefDllDemo_EXPORTS #defineDllAPI__declspec(dllexport) #else #defineDllAPI__declspec(dllimport) externC/原樣編譯 DllAPIint__stdcallMax(inta,intb);/__stdcall使非C/C+語言內能夠調用API #endif3、在DllDemo.cpp文件中導入DllDemo.h文件,并實現Max(int,int)函數#includeDllDemo.h DllAPIint__stdcallMax(inta,intb) if(a=b) returnNULL; elseif(ab) returna; else returnb; 4、編譯程序生成動態連接庫二、用.def文件創建動態連接庫DllDemo.dll1、刪除DllDemo工程中的DllDemo.h文件。2、在DllDemo.cpp文件頭,刪除 #include DllDemo.h語句。3、向該工程中加入一個文本文件,命名為DllDemo.def并寫入如下語句:LIBRARY MyDllEXPORTSMax14、編譯程序生成動態連接庫。動態鏈接的調用步驟:一、隱式調用1、建立DllCnslTest工程2、將文件DllDemo.dll、DllDemo.lib拷貝到DllCnslTest工程所在的目錄3、在DllCnslTest.h中添加如下語句:#defineDllAPI__declspec(dllimport) #pragmacomment(lib,DllDemo.lib)/在編輯器link時,鏈接到DllDemo.lib文件 externC DllAPIint__stdcallMax(inta,intb); 4、在DllCnslTest.cpp文件中添加如下語句:#includeDllCnslTest.h/或者#includeDllDemo.h voidmain() intvalue; value=Max(2,9); printf(TheMaxvalueis%dn,value); 5、編譯并生成應用程序DllCnslTest.exe二、顯式調用1、建立DllWinTest工程。2、將文件DllDemo.dll拷貝到DllWinTest工程所在的目錄或Windows系統目錄下。3、用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函數結構。4、使用類型定義關鍵字typedef,定義指向和DLL中相同的函數原型指針。例:typedefint(*lpMax)(inta,intb);/此語句可以放在.h文件中5、通過LoadLibray()將DLL加載到當前的應用程序中并返回當前DLL文件的句柄。例:HINSTANCEhDll;/聲明一個Dll實例文件句柄 hDll=LoadLibrary(DllDemo.dll);/導入DllDemo.dll動態連接庫6、通過GetProcAddress()函數獲取導入到應用程序中的函數指針。例:lpMaxMax; Max=(lpMax)GetProcAddress(hDLL,Max); intvalue; value=Max(2,9); printf(TheMaxvalueis%d,value);7、函數調用完畢后,使用FreeLibrary()卸載DLL文件。FreeLibrary(hDll);8、編譯并生成應用程序DllWinTest.exe
總結
以上是生活随笔為你收集整理的cnsl是什么意思_VS2010下创建静态链接库和动态链接库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言求x和y的乘积,计算方程式,求x,
- 下一篇: IOS UIViewController