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),这一句是显式的导入静态链接库。除此之外,还有其他的方法,比如通过设置路径等等,这里不做介绍。或者选中工程名,点击右键-属性,在“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下创建静态链接库和动态链接库相关推荐

  1. Linux下的静态链接库和动态链接库编程

    Linux下的静态链接库和动态链接库编程 参考: Linux下的静态链接库和动态链接库编程 - Histring - 博客园 Mac下静态库和动态库的创建和使用_C/C++_vincent2610的专 ...

  2. Linux下的静态链接库和动态链接库

    Linux下的静态链接库和动态链接库 零.链接库概述 Linux下得库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀.面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数, ...

  3. C++ 创建静态链接库和动态链接库

    上篇文章演示了如何使用C++ 编译的静态链接库和动态链接库,本篇文章主要介绍如何创建静态链接库和动态链接库,本文使用的工具是visual studio 2019 企业版,需要安装对应的C++sdk,可 ...

  4. KEIL 创建静态链接库+ 调用自己创建的静态链接库

    1.为什么要创建静态链接库? 当公司或者个人需要提供自己的编写的代码供他人调用时,而你或提供方并不想提供源代码(.c源代码),只想提供头文件.h(在头文件中申明函数)供他人调用,他人在调用时只需要知道 ...

  5. linux下静态链接库和动态链接库

    关于链接库的知识,网上太多资料了,但是并不代表我很熟悉.今天遇到了 一个问题,就是由于静态链接库和ubuntu系统不兼容导致的,虽然花了点时间才搞定 但是,其中暴露的问题也不少. 没有区分好静态链接库 ...

  6. 静态链接库和动态链接库(转)

    我们可以创建一种文件里面包含了很多函数和变量的目标代码,链接的时候只要把这个文件指示给链接程序就自动地从文件中查找符合要求的函数和变量进行链接,整个查找过程根本不需要我们操心. 这个文件叫做 &quo ...

  7. 静态链接库、动态链接库和动态加载库

    前言 静态库是obj文件的一个集合(目标文件中通常仅解析了文件内部的变量和函数,对于引用的函数和变量还没有解析,这需要将其他已经编写好的目标文件引用进来,将没有解析的函数和变量进行解析,通常引用的目标 ...

  8. UNIX环境高级编程(三)—— 静态链接库与动态链接库

    动态链接库一般不开放源码,需要建工程才能使用(其中提供的接口和 API): 0. .a/.o/.so What are .a and .so files? .o 就相当于 windows 里的 obj ...

  9. 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库

    前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...

最新文章

  1. SQL Server 中master..spt_values的应用
  2. ping不通www.baidu.com,但可以访问www.baidu.com网页
  3. 「Innovation 2021」网易应用创新开发者大赛正式收官,十强选手精彩对决
  4. [LeetCode]题解(python):025-Reverse Nodes in k-Group
  5. 99+好友共同关注,公众号推荐
  6. 最简便的Unity详细安装步骤及官网插件
  7. 临床实验中关于 T 检验的应用与解释
  8. 域名被抢注的知名案例有哪些?
  9. 联合办公室出租,富有办公成效
  10. 我的挣扎 与 TBtools 的开发
  11. android然后让list刷新到底部,Android笔记之:App列表之下拉刷新的使用
  12. DDD 战术模型之聚合
  13. 基于ROS+镭神激光雷达+amcl定位、导航的智能车学习记录
  14. 07-HTML5举例:简单的视频播放器
  15. JQuery实现图片点击放大
  16. STM32配置DAC输出固定电压和方波
  17. cinta作业7:同态同构商群正规子群
  18. pptx文件怎么打开
  19. 这些年我们还在使用的国内国外域名注册商
  20. 谁在说谎--Python实现

热门文章

  1. 字体选择_十分钟带你掌握精准选择字体的方法!
  2. oracle存储返回sql查询,如何做才能使record类型和table类型存储查询语句返回的多条记录?...
  3. 怎么证明建立了存储过程_【Filecoin源码仓库全解析】第七章:了解PoRep与PoSt并参与复制证明游戏
  4. php active控件,php – 使用TbActiveForm选择列表中的动态选项
  5. docker privileged作用_docker总结
  6. kali2020识别不到网卡_WIN10环境下台式机找不到RealTek HD管理器解决耳塞式耳机外放问题...
  7. java怎么将程序保存在桌面_在Java桌面应用程序中保留数据的最佳方法是什么?...
  8. QQ浏览器如何更改截图路径
  9. PageHelper分页插件源码及原理剖析
  10. spring源码阅读--@Transactional实现原理