静态库(lib)和动态库(dll)的使用 |
您所在的位置:网站首页 › jpeg是动态还是静态 › 静态库(lib)和动态库(dll)的使用 |
静态库(lib)和动态库(dll)的理解与使用
前言一、函数重载的理解二、extern “C” 的理解三、静态库的调用1.静态库的生成2.静态库的调用
四、动态库的调用1.动态库的生成2.动态库的调用
前言
静态库和动态库在windows软件开发当中很常用,好的软件架构很多功能都是以库的形式存在,假如该功能需要升级,则直接替换该库文件就行,不需要把整个程序进行升级。这样维护起来就比较方便。 常见的库文件有.lib和.dll两种形式,分别是静态库和动态库。 静态库在形成exe文件时,全部被打包进去。 动态库只是在运行的时候用到的函数才会被导入到exe中,可以动态的加载和卸载。 一、函数重载的理解C++中支持函数重载,C中不支持函数重载。 C中同名的函数编译之后,函数名都相同,以VS举例,都是以下划线开头 “_”,所以如果调用,都不知道调用哪个函数,所以C不支持重载。 cdecl就是这种调用方式,直接寻找原函数名,函数名不添加任何修饰。 C++中同名的函数编译之后,编译器会在函数名中加入参数类型和参数个数等含义进行区分,即每个函数名都不同,可以进行区分,所以C++支持重载。(C++中的命名规则:Name-Mangling) (下面图片中显示的每个不同参数的同名函数,后面编译的函数名称都不同) stdcall这种调用方式,就会在原函数名上添加参数等修饰,用来区分函数重载时相同函数函数而函数体和参数不同的情况。 二、extern “C” 的理解 上面提到C++在编译函数之后,会对其名字进行再次修改,增加参数信息,那么C++的函数和C的函数是无法互相调用的,因为编译后各自的函数名不同, 链接的时候会因为找不到函数名称而报错。但是实际当中却可以,说明进行过一定的处理。这就是 extern “C”的作用。 其作用就是:将函数名按照C中生成函数名的方式去生成。这样的话,即使各自编译器生成函数名的方式不用,但都是按照C的标准来生成,那么可以互相调用,所以动态库如果要被外部调用,一般都要加这个修饰。 三、静态库的调用 1.静态库的生成(1)生成静态库(lib) 首先点击静态库(Visual C++),然后选好目录之后,点击确定。 可以去掉其他文件,只留下pch.h和pch.cpp即可, 静态库.h程序 #ifndef PCH_H #define PCH_H #include void Print(); int Add(int a, int b); #endif //PCH_H静态库.cpp程序 #include "pch.h" using namespace std; void Print() { cout Print(); std::cout return ((a)-(b)); }没错,你看完之后,发现动态库可以调用静态库,本文当中的Dll库调用之前生成的StaticLib.lib,添加了静态库的头文件。 这也是静态库和动态库的区别,动态库可以包含其他静态库或者动态库,而静态库则无法包含其他的静态库或者动态库。 完成编程之后,点击生成,可以看到有.dll库生成,进入其文件夹,会发现有对应的.lib文件生成,这里面不是库程序,只是dll文件的函数名称和位置,方便找到.dll函数实体。 如果发现有下面图中的错误这样的错误,那么是预编译头的问题,选择不使用预编译头即可正常完成编译。(预编译文件被删除。) 2.动态库的调用 隐式调用:将Dll.dll和Dll.lib和Dll.h放在工程目录下面。 链接器-》输入添加附加依赖项,选择Dll.lib, Dll.lib添加在资源文件或者附件依赖项中都可以,然后主函数中添加“Dll.h”头文件,调用库中的函数, 点击调试,可以正常运行。 显式调用:不添加.h文件和.lib文件,直接导入dll库,通过函数指针去调用库中的函数。具体流程如下: 1、导入dll库 LoadLibrary(库名称) 2、构造函数指针,要和库文件中函数一致,包括函数参数和类型。 3、通过函数指针获取函数地址,GetProcAddress(句柄,函数名/函数序号);(函数序号:函数在.h中声明的顺序) 4、利用函数指针调用函数 #include #include int main() { std::cout |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |