日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cnsl是什么意思_VS2010下创建静态链接库和动态链接库

發(fā)布時間:2025/3/12 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cnsl是什么意思_VS2010下创建静态链接库和动态链接库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

VS2010下創(chuàng)建靜態(tài)鏈接庫和動態(tài)鏈接庫

類封裝成dll如果你的工作長期與某個領(lǐng)域相關(guān),比如說長期做直接體繪制 (DVR)方面的開發(fā),那么你可能經(jīng)常使用自己的傳遞函數(shù)類,如果每一個工程你都把傳遞函數(shù)類的.h和.cpp文件添加進(jìn)去會比較麻煩,其實(shí),我們可以像 使用opengl的庫那樣來用你自己的類,做法就是把你寫好的類封裝成dll,具體做法如下: 第一步:制作dll 利用VC6新建工程時選擇win32 dynamic-Link Library(空的工程),然后添加頭文件和cpp文件。假設(shè)你要封裝的類的名成是TransferFunction,添加頭文件 TransferFunction.h和TransferFunction.cpp到工程中。并將TransferFunction.h修改成: class __declspec(dllexport)TransferFunction . 從而說明以后從dll要被導(dǎo)出的類是哪一個。這樣編譯完就會產(chǎn)生TransferFunction.dll和TransferFunction.lib兩個文件。 第二步:如何使用這個dll 當(dāng)已經(jīng)生成dll后,有兩種方法可以在其它程序中調(diào)用dll中的類和成員函數(shù): 方法一: 1)把TransferFunction.dll和TransferFunction.lib復(fù)制到調(diào)用程序的執(zhí)行路徑下,注意不是debug路徑下。 2)在project-setting-link里添加TransferFunction.lib(或者用#pragma comment(lib, TransferFunction.lib) ) 3)把TransferFunction.h中的__declspec(dllexport)改成__declspec(dllimport) 然后復(fù)制到調(diào)用程序的執(zhí)行路徑下。 4)最后在主程序中就可以通過包含TransferFunction.h來使用TransferFunction類和它的成員函數(shù)。 方法二(推薦): 在方法一中,你每次建立一個工程都需要把 TransferFunction.dll,TransferFunction.lib,TransferFunction.h三個文件拷貝到工程里面 去,事實(shí)上這只發(fā)揮了dll對類的代碼保護(hù)的功能,并沒有多大的減輕編程人員的工作量,下面的方法可以減少編程人員的工作量,具體步驟: undefined1:將TransferFunction.dll扔到windowssystem32下 2:將.TransferFunctionlib扔到VC的lib目錄里 3:將方法一中的TransferFunction.h扔到VC的include目錄里 4:同方法一的最后一步。 以后你就可以像使用Opengl的glut、glui等庫一樣使用你自己封裝的一個經(jīng)常復(fù)用的類了。VS2010下創(chuàng)建靜態(tài)鏈接庫和動態(tài)鏈接庫 下面介紹一下用VS2010如何創(chuàng)建靜態(tài)鏈接庫和動態(tài)鏈接庫,并測試創(chuàng)建的庫。1.靜態(tài)鏈接庫打開VS2010,新建一個項(xiàng)目,選擇win32項(xiàng)目,點(diǎn)擊確定,選擇靜態(tài)庫這個選項(xiàng),預(yù)編譯頭文件可選可不選。 在這個空項(xiàng)目中,添加一個.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. 編譯這個項(xiàng)目之后,會在debug文件夾下生成static.lib文件,這個就是我們需要的靜態(tài)鏈接庫。下面說明如何調(diào)用靜態(tài)鏈接庫。首先需要新建一個空項(xiàng)目,起名為test。將之前static項(xiàng)目下的static.h和static.lib這個2個文件復(fù)制到test項(xiàng)目的目錄下,并在工程中加入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. 編譯運(yùn)行可得結(jié)果:3 #pragma comment(lib,static.lib),這一句是顯式的導(dǎo)入靜態(tài)鏈接庫。除此之外,還有其他的方法,比如通過設(shè)置路徑等等,這里不做介紹。2.動態(tài)鏈接庫和創(chuàng)建靜態(tài)鏈接庫一樣,需要創(chuàng)建一個空的win32項(xiàng)目,選擇dll選項(xiàng)。創(chuàng)建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編譯這個項(xiàng)目,會在debug文件夾下生成dynamic.dll文件。下面介紹如何調(diào)用動態(tài)鏈接庫,這里講的是顯式的調(diào)用。在剛才的test項(xiàng)目下,把static.lib和static.h文件刪除,把dynamic.h和dynamic.dll復(fù)制到該目錄下,并在項(xiàng)目中添加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編譯運(yùn)行結(jié)果為:3特別提示:1.extern C中的C是大寫,不是小寫2.如果從VS2010中直接運(yùn)行程序,lib和dll需要放到test項(xiàng)目的目錄下;如果想雙擊項(xiàng)目test下的debug文件中的exe文件直接運(yùn)行的話,需把lib和dll放入debug文件夾下。VS2010下靜態(tài)鏈接庫和動態(tài)鏈接庫總結(jié)尚哥發(fā)表于 8月前 (2015-01-28 08:46:16) | 評論(0)| 閱讀次數(shù)(1518)|0人收藏此文章, 我要收藏靜態(tài)鏈接庫對于靜態(tài)鏈接庫是函數(shù)庫的情況如下:生成靜態(tài)鏈接庫:必須要有頭文件。對于靜態(tài)鏈接庫是函數(shù)庫的情況如下:.h文件中是函數(shù)的聲明,.cpp文件中是函數(shù)的實(shí)現(xiàn)。舉例:jj測試靜態(tài)鏈接庫(1) #include “.h” /編譯時候需要 注意:如果.h文件不在源程序文件同級目錄下,需要配置VS環(huán)境:項(xiàng)目屬性-配置屬性-C/C+-常規(guī)-附加包含目錄,可以事先將.h文件放到某個位置的lnclude文件夾中,當(dāng)添加附加包含目錄時候?qū)⑵涠ㄎ坏皆搇nclude文件夾。(2) #pragma comment(lib,*.lib) 或者配置VS環(huán)境方式引入庫文件.lib,具體項(xiàng)目屬性-配置屬性-鏈接器-輸入-附加依賴項(xiàng) /鏈接時候需要 注意:如果.lib庫文件不在源程序文件同級目錄下,需要配置VS環(huán)境:項(xiàng)目屬性-配置屬性-鏈接器-常規(guī)-附加庫目錄,可以事先將.lib文件放到某個位置的lib文件夾中,當(dāng)添加附加庫目錄時候?qū)⑵涠ㄎ坏皆搇ib文件夾。舉例:對于動態(tài)鏈接庫是函數(shù)庫的情況如下:動態(tài)鏈接庫生成動態(tài)鏈接庫:頭文件可以不要。但一般第三方都會有頭文件,因?yàn)槿绻麤]有頭文件,則需要在實(shí)現(xiàn)文件中使用函數(shù)之前聲明函數(shù),而一般對于用戶來講都是不知道函數(shù)聲明的,而且對于一個工程中使用多個導(dǎo)出函數(shù)的情況還需要多個函數(shù)的聲明比較麻煩,所以實(shí)際中還是都有頭文件的。頭文件是函數(shù)的聲明,聲明前需要修飾符_declspec(dllexport) 或者extern 也行,如果動態(tài)庫是用C語言寫的,就需要寫成 externa “C”的方式。(說明:實(shí)際上,當(dāng)你想導(dǎo)入一個符號時,你不需要用到__declspec(dllimport). 用extern就可以了。但是,如果用__declspec(dllimport)的話,編譯器會生成更有效率的代碼。)實(shí)現(xiàn)文件函數(shù)前就不再需要修飾符_declspec(dllexport) 等了。測試動態(tài)鏈接庫對于提供頭文件的情況:#include .h /路徑問題同靜態(tài)鏈接庫頭文件引入 編譯時候需要#pragma comment(lib,*.lib) /路徑問題同靜態(tài)鏈接庫庫引入,實(shí)際對于動態(tài)鏈接庫來講,此時的.lib文件是導(dǎo)入庫。 鏈接時候需要不提供頭文件的情況:不需要寫#include .h ,因?yàn)闆]有。此時要完成函數(shù)聲明功能,需要使用extern int add(int x,int y);來實(shí)現(xiàn)函數(shù)的聲明或者 _declspec(dllimport) int add(int x,int y)來聲明引入的函數(shù)。#pragma comment(lib,*.lib) /路徑問題同靜態(tài)鏈接庫庫引入,實(shí)際對于動態(tài)鏈接庫來講,此時的.lib文件是導(dǎo)入庫。 鏈接時候需要。1.隱式調(diào)用 把dlltest.dlldlltest.lib dlltest.h 三個文件考到本地工程目錄下面2.顯示調(diào)用動態(tài)庫函數(shù) 只需要將dlltest.dll文件復(fù)制到本地工程目錄下。一般動態(tài)鏈接庫的標(biāo)準(zhǔn)寫法如下:VC+ 程序 如何封裝為dll文件VC+分享到:專業(yè)回答ljmdzyx0072013-09-13 22:28創(chuàng)建新的動態(tài)鏈接庫 (DLL) 項(xiàng)目從 “文件”菜單中,選擇 “新建”,然后選擇 “項(xiàng)目”。在 “項(xiàng)目類型”窗格中,選擇 “Visual C+”下的 “Win32”。在 “模板”窗格中,選擇 “Win32 控制臺應(yīng)用程序”。為項(xiàng)目選擇一個名稱,如MathFuncsDll,并將其鍵入 “名稱”字段。 為解決方案選擇一個名稱,如DynamicLibrary,并將其鍵入 “解決方案名稱”字段。單擊 “確定”啟動 Win32 應(yīng)用程序向?qū)АT?“Win32 應(yīng)用程序向?qū)А睂υ捒虻?“概述”頁中,單擊 “下一步”。在 “Win32 應(yīng)用程序向?qū)А敝械?“應(yīng)用程序設(shè)置”頁中,選擇 “應(yīng)用程序類型”下的 “DLL”(如果可用),或者選擇 “控制臺應(yīng)用程序”(如果 “DLL”不可用)。 某些版本的 Visual Studio不支持通過使用向?qū)?chuàng)建 DLL 項(xiàng)目。您可以稍后對此進(jìn)行更改,以將項(xiàng)目編譯為DLL。在 “Win32 應(yīng)用程序向?qū)А钡?“應(yīng)用程序設(shè)置”頁中,選擇 “附加選項(xiàng)”下的 “空項(xiàng)目”。單擊 “完成”創(chuàng)建項(xiàng)目。向動態(tài)鏈接庫添加類若要為新類創(chuàng)建頭文件,請從 “項(xiàng)目”菜單中選擇 “添加新項(xiàng)”。將顯示 “添加新項(xiàng)”對話框。在 “類別”窗格中,選擇 “Visual C+”下的 “代碼”。 在 “模板”窗格中選擇 “頭文件(.h)”。 為頭文件選擇一個名稱,如MathFuncsDll.h,并單擊 “添加”。 將顯示一個空白文件。添加一個名為“MyMathFuncs”的簡單類,以執(zhí)行常見的算術(shù)運(yùn)算,如加、減、乘和除。代碼應(yīng)與以下內(nèi)容類似:以帶有顏色區(qū)分的格式查看復(fù)制到剪貼板打印/ 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能夠?qū)С鲈摲椒ㄒ怨┢渌麘?yīng)用程序使用。有關(guān)更多信息,請參見 dllexport, dllimport。若要為新類創(chuàng)建源文件,請從 “項(xiàng)目”菜單中選擇 “添加新項(xiàng)”。將顯示 “添加新項(xiàng)”對話框。在 “類別”窗格中,選擇 “Visual C+”下的 “代碼”。 在 “模板”窗格中,選擇 “C+ 文件(.cpp)”。 為源文件選擇一個名稱,如MathFuncsDll.cpp,并單擊 “添加”。 將顯示一個空白文件。在源文件中實(shí)現(xiàn)“MyMathFuncs”的功能。代碼應(yīng)與以下內(nèi)容類似:以帶有顏色區(qū)分的格式查看復(fù)制到剪貼板打印/ 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;若要將項(xiàng)目生成為 DLL,請從“項(xiàng)目”菜單中選擇MathFuncsDll “屬性.”。 在左窗格中,選擇 “配置屬性”下的 “常規(guī)”。在右窗格中,將 “配置類型”更改為 “動態(tài)庫(.dll)”。單擊 “確定”保存更改。說明如果您從命令行生成項(xiàng)目,請使用/LD 編譯器選項(xiàng)指定輸出文件應(yīng)為 DLL。有關(guān)更多信息,請參見 /MD、/MT、/LD(使用運(yùn)行庫)。編譯該動態(tài)鏈接庫,方法是選擇“生成”菜單中的 “生成解決方案”。這樣就創(chuàng)建了一個可供其他程序使用的DLL。VS2010生成靜態(tài)庫(.lib)時間2013-06-17 18:37:46CSDN博客原文http:/blog.csdn.net/ivanljf/article/details/主題Visual Studio動態(tài)庫打開VS2010,新建一個項(xiàng)目,選擇win32項(xiàng)目,點(diǎn)擊確定,選擇靜態(tài)庫這個選項(xiàng),預(yù)編譯頭文件不選。在這個空項(xiàng)目中,添加一個.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;編譯這個項(xiàng)目之后(生成生成解決方案),會在debug文件夾下生成static.lib文件,這個就是我們需要的靜態(tài)鏈接庫。下面說明如何調(diào)用靜態(tài)鏈接庫。首先需要新建一個空項(xiàng)目,起名為test。將之前static項(xiàng)目下的static.h和static.lib這個2個文件復(fù)制到test項(xiàng)目的目錄下,并在工程中加入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;編譯運(yùn)行可得結(jié)果:31#pragma comment(lib,static.lib),這一句是顯式的導(dǎo)入靜態(tài)鏈接庫。除此之外,還有其他的方法,比如通過設(shè)置路徑等等,這里不做介紹。或者選中工程名,點(diǎn)擊右鍵-屬性,在“VC+目錄”的包含目錄里面加入static.h的所在目錄的路徑,庫目錄里面加入static.lib所在目錄的路徑;在鏈接器-輸入-附加依賴項(xiàng)輸入“static.lib”。然后源文件里添加#includestatic.h就OK了。題外話摘自百度百科:程序編譯一般需經(jīng)預(yù)處理、編譯、匯編和鏈接幾個步驟。在我們的應(yīng)用中,有一些公共代碼是需要反復(fù)使用,就把這些代碼編譯為“庫”文件;在鏈接步驟中,連接器將從庫文件取得所需的代碼,復(fù)制到生成的可執(zhí)行文件中。這種庫稱為靜態(tài)庫,其特點(diǎn)是可執(zhí)行文件中包含了庫代碼的一份完整拷貝;缺點(diǎn)就是被多次使用就會有多份冗余拷貝。靜態(tài)庫和動態(tài)庫是兩種共享程序代碼的方式,它們的區(qū)別是:靜態(tài)庫在程序的鏈接階段被復(fù)制到了程序中,和程序運(yùn)行的時候沒有關(guān)系;動態(tài)庫在鏈接階段沒有被復(fù)制到程序中,而是程序在運(yùn)行時由系統(tǒng)動態(tài)加載到內(nèi)存中供程序調(diào)用。使用動態(tài)庫的優(yōu)點(diǎn)是系統(tǒng)只需載入一次動態(tài)庫,不同的程序可以得到內(nèi)存中相同的動態(tài)庫的復(fù)本,因此節(jié)省了很多內(nèi)存。Dll無法直接導(dǎo)出泛型模板(generalizedtemplate),因此,如果要導(dǎo)出stl類,則模板必須先實(shí)例化(instantiated)。另外,如果導(dǎo)出的STL類使用了其他STL類,那么這些其他類必須同時被導(dǎo)出。目前stl中唯一能夠被導(dǎo)出的容器是vector,其他容器(如map、set、queue、list、deque)都因包含嵌套類而不能被導(dǎo)出。導(dǎo)出STL類的步驟:在Dll和exe文件中,用同樣版本的c運(yùn)行庫鏈接。譬如都用Msvcrt.lib(release)鏈接或都用Msvcrtd.lib(debug)鏈接。Dll中,用__declspec(dllexport)導(dǎo)出模板類的實(shí)例。在exe文件中,用__declspec(dllimport)和extern關(guān)鍵字從Dll中導(dǎo)入stl類。需要注意的是:當(dāng)導(dǎo)出一個以自定義類為模板參數(shù)的stl容器,必須為這個自定義類型定義和=運(yùn)算符。譬如,如果要導(dǎo)出std:vectorCPerson類,則必須為CPerson添加和=運(yùn)算符。#ifdefEXP_STL#defineDECLSPECIFIER__declspec(dllexport)#defineEXPIMP_TEMPLATE#else#defineDECLSPECIFIER__declspec(dllimport)#defineEXPIMP_TEMPLATEextern#endif/導(dǎo)出stl類std:vectorCPersonclassCPersonpublic:intm_nAge;charm_strName40;public:booloperator(constCPerson&c)constreturntrue;booloperator=(constCPerson&c)constreturntrue;EXPIMP_TEMPLATEtemplateclassVECDLL_APIstd:vectorCPerson;/顯式實(shí)例化模板類VECDLL_APIintfnVecDll(std:vectorCPerson&vecPer);/導(dǎo)出函數(shù)定義這兩個運(yùn)算符的原因是:所有stl容器都有比較成員函數(shù),這些成員函數(shù)需要調(diào)用自定義類型的和=運(yùn)算符。通常情況下,由于沒有使用這些成員函數(shù),所以它們沒有被實(shí)例化,所以我們使用時一般就不需要為CPerson定義這兩個運(yùn)算符。然而,當(dāng)顯示實(shí)例化此容器類時,它所有的成員函數(shù)都需實(shí)例化,包括它的“比較”成員函數(shù),所以這時必須實(shí)現(xiàn)CPerson的和=運(yùn)算符。如果CPerson并不在乎和=的意義,我們可以像上面代碼所示通過簡單返回true來實(shí)現(xiàn)它們。導(dǎo)出一個數(shù)據(jù)成員包含stl對象的類。方法與上類似。如下代碼所示:EXPIMP_TEMPLATEtemplateclassVECDLL_APIstd:vectorint/顯式實(shí)例化std:vectorintclassVECDLL_APICContainerpublic:std:vectorintm_vecNum;VS下 dllimport與dllexport作用與區(qū)別時間:2014-11-24 18:32:32 閱讀:234 評論:0 收藏:0點(diǎn)我收藏+標(biāo)簽:desclassstyle代碼使用comlog文件問題我相信寫WIN32程序的人,做過DLL,都會很清楚__declspec(dllexport)的作用,它就是為了省掉在DEF文件中手工定義導(dǎo)出哪些函數(shù)的一個方法。當(dāng)然,如果你的DLL里全是C+的類的話,你無法在DEF里指定導(dǎo)出的函數(shù),只能用__declspec(dllexport)導(dǎo)出類。但是,MSDN文檔里面,對于__declspec(dllimport)的說明讓人感覺有點(diǎn)奇怪,先來看看MSDN里面是怎么說的:不使用 __declspec(dllimport) 也能正確編譯代碼,但使用 __declspec(dllimport) 使編譯器可以生成更好的代碼。編譯器之所以能夠生成更好的代碼,是因?yàn)樗梢源_定函數(shù)是否存在于 DLL 中,這使得編譯器可以生成跳過間接尋址級別的代碼,而這些代碼通常會出現(xiàn)在跨 DLL 邊界的函數(shù)調(diào)用中。但是,必須使用 __declspec(dllimport) 才能導(dǎo)入 DLL 中使用的變量。初看起來,這段話前面的意思是,不用它也可以正常使用DLL的導(dǎo)出庫,但最后一句話又說,必須使用 __declspec(dllimport) 才能導(dǎo)入 DLL 中使用的變量這個是什么意思?那我就來試驗(yàn)一下,假定,你在DLL里只導(dǎo)出一個簡單的類,注意,我假定你已經(jīng)在項(xiàng)目屬性中定義了 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的項(xiàng)目不用定義 SIMPLEDLL_EXPORT 所以,DLL_EXPORT 就不會存在了,這個時候,你在APP中,不會遇到問題。這正好對應(yīng)MSDN上說的__declspec(dllimport)定義與否都可以正常使用。但我們也沒有遇到變量不能正常使用呀。那好,我們改一下SimpleDLLClass,把它的m_nValue改成static,然后在cpp文件中加一行int SimpleDLLClass:m_nValue=0;如果你不知道為什么要加這一行,那就回去看看C+的基礎(chǔ)。 改完之后,再去LINK一下,你的APP,看結(jié)果如何,結(jié)果是LINK告訴你找不到這個m_nValue。明明已經(jīng)定義了,為什么又沒有了?肯定是因?yàn)槲野裮_nValue定義為static的原因。但如果我一定要使用Singleton的Design Pattern的話,那這個類肯定是要有一個靜態(tài)成員,每次LINK都沒有,那不是完了? 如果你有Platform SDK,用里面的Depend程序看一下,DLL中又的確是有這個m_nValue導(dǎo)出的呀。再回去看看我引用MSDN的那段話的最后一句。 那我們再改一下SimpleDLLClass.h,把那段改成下面的樣子:#ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT __declspec(dllimport)#endif再LINK,一切正常。原來dllimport是為了更好的處理類中的靜態(tài)成員變量的,如果沒有靜態(tài)成員變量,那么這個__declspec(dllimport)無所謂。_declspec(dllexport)與_declspec(dllimport)都是DLL內(nèi)的關(guān)鍵字,即導(dǎo)出與導(dǎo)入。他們是將DLL內(nèi)部的類與函數(shù)以及數(shù)據(jù)導(dǎo)出與導(dǎo)入時使用的。主要區(qū)別在于,dllexport是在這些類、函數(shù)以 及數(shù)據(jù)的申明的時候使用。用過表明這些東西可以被外部函數(shù)使用,即(dllexport)是把DLL中的相關(guān)代碼(類,函數(shù),數(shù)據(jù))暴露出來為其他應(yīng)用程 序使用。使用了(dllexport)關(guān)鍵字,相當(dāng)于聲明了緊接在(dllexport)關(guān)鍵字后面的相關(guān)內(nèi)容是可以為其他程序使用的。而dllimport關(guān)鍵字是在外部程序需要使用DLL內(nèi)相關(guān)內(nèi)容時使用的關(guān)鍵字。當(dāng)一個外部程序要使用DLL內(nèi)部代碼(類,函數(shù),全局變量)時,只需要在 程序內(nèi)部使用(dllimport)關(guān)鍵字聲明需要使用的代碼就可以了,即(dllimport)關(guān)鍵字是在外部程序需要使用DLL內(nèi)部相關(guān)內(nèi)容的時候才 使用。(dllimport)作用是把DLL中的相關(guān)代碼插入到應(yīng)用程序中。_declspec(dllexport)與_declspec(dllimport)是相互呼應(yīng),只有在DLL內(nèi)部用dllexport作了聲明,才能 在外部函數(shù)中用dllimport導(dǎo)入相關(guān)代碼。實(shí)際上,在應(yīng)用程序訪問DLL時,實(shí)際上就是應(yīng)用程序中的導(dǎo)入函數(shù)與DLL文件中的導(dǎo)出函數(shù)進(jìn)行鏈接。而 且鏈接的方式有兩種:隱式迎接和顯式鏈接。隱式鏈接是指通過編譯器提供給應(yīng)用程序關(guān)于DLL的名稱和DLL函數(shù)的鏈接地址,面在應(yīng)用程序中不需要顯式地將DLL加載到內(nèi)存,即在應(yīng)用程序中使用dllimport即表明使用隱式鏈接。不過不是所有的隱式鏈接都使用dllimport。顯式鏈接剛同應(yīng)用程序用語句顯式地加載DLL,編譯器不需要知道任何關(guān)DLL的信息以下是一個DLL頭文件的正規(guī)編寫方式: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+中動態(tài)鏈接庫的創(chuàng)建和調(diào)用2007-02-05 14:12天極網(wǎng)我要評論(0)字號:T|T本文詳細(xì)介紹了動態(tài)連接庫的創(chuàng)建步驟和動態(tài)鏈接的調(diào)用步驟,供大家參考!AD:【線下活動】三大新銳HTML 5企業(yè)匯聚51CTO大話移動前端技術(shù)動態(tài)連接庫的創(chuàng)建步驟:一、創(chuàng)建Non-MFC DLL動態(tài)鏈接庫1、打開File New Project選項(xiàng),選擇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+語言內(nèi)能夠調(diào)用API #endif3、在DllDemo.cpp文件中導(dǎo)入DllDemo.h文件,并實(shí)現(xiàn)Max(int,int)函數(shù)#includeDllDemo.h DllAPIint__stdcallMax(inta,intb) if(a=b) returnNULL; elseif(ab) returna; else returnb; 4、編譯程序生成動態(tài)連接庫二、用.def文件創(chuàng)建動態(tài)連接庫DllDemo.dll1、刪除DllDemo工程中的DllDemo.h文件。2、在DllDemo.cpp文件頭,刪除 #include DllDemo.h語句。3、向該工程中加入一個文本文件,命名為DllDemo.def并寫入如下語句:LIBRARY MyDllEXPORTSMax14、編譯程序生成動態(tài)連接庫。動態(tài)鏈接的調(diào)用步驟:一、隱式調(diào)用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、編譯并生成應(yīng)用程序DllCnslTest.exe二、顯式調(diào)用1、建立DllWinTest工程。2、將文件DllDemo.dll拷貝到DllWinTest工程所在的目錄或Windows系統(tǒng)目錄下。3、用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函數(shù)結(jié)構(gòu)。4、使用類型定義關(guān)鍵字typedef,定義指向和DLL中相同的函數(shù)原型指針。例:typedefint(*lpMax)(inta,intb);/此語句可以放在.h文件中5、通過LoadLibray()將DLL加載到當(dāng)前的應(yīng)用程序中并返回當(dāng)前DLL文件的句柄。例:HINSTANCEhDll;/聲明一個Dll實(shí)例文件句柄 hDll=LoadLibrary(DllDemo.dll);/導(dǎo)入DllDemo.dll動態(tài)連接庫6、通過GetProcAddress()函數(shù)獲取導(dǎo)入到應(yīng)用程序中的函數(shù)指針。例:lpMaxMax; Max=(lpMax)GetProcAddress(hDLL,Max); intvalue; value=Max(2,9); printf(TheMaxvalueis%d,value);7、函數(shù)調(diào)用完畢后,使用FreeLibrary()卸載DLL文件。FreeLibrary(hDll);8、編譯并生成應(yīng)用程序DllWinTest.exe

總結(jié)

以上是生活随笔為你收集整理的cnsl是什么意思_VS2010下创建静态链接库和动态链接库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。