一、静态库的创建及调用
最近在编程序的时候,用到静态库和动态库的创建和调用,将自己的一些心得总结如下,希望对各位有所帮助,有不恰当之处欢迎评论留言。
静态库和动态库的区别可以参考博客:windows中静态库lib和动态dll的区别及使用方法_dxzysk的专栏-CSDN博客_动态dll和静态库的区别
1、静态库的创建
为了方便大家学习,从空项目进行演示,实现输入两个数求出两数之和及两数之差,本文使用VS2017编译器。
(1)创建空项目
(2)新建头文件.h和源文件.cpp
其中test工程为后面测试用工程,现在不用考虑。
(3)修改项目属性,将目标文件扩展名和配置类型均修改为.lib
(4)在项目头文件testLib.h中编写代码
方法一和方法二均可以生成和调用
(5)源文件testLib.cpp代码编写
(6)工程生成
可以看到工程目录下生成了testLib.ib和testLib.pdb文件,代表静态库生成成功。
2、静态库的调用
(1)为了方便演示,在静态库生成的同解决方案下创建测试工程test,本地创建的是控制台应用程序。
(2)创建完测试工程后,在test.cpp文件中编写静态库调用程序
(3)将test工程设置为启动工程,编译运行,会出现报错
(4)针对(3)出现的报错,需要在项目中引入静态库文件路径
静态库生成工程和测试工程目录如下:
引入静态库的相对路径
再次编译就可以成功。
运行结果如下
至此,静态库的创建及调用讲解结束。
二、动态库的创建及调用
1、动态库的创建
动态库的创建介绍两种方式:__declspec(dllexport)和.def文件导出。
1.1、动态库的创建(__declspec(dllexport))
(1)同静态库一样创建空项目testDll,创建头文件和源文件
(2)修改项目属性,将目标文件扩展名和配置类型均修改为.dll
(3)修改项目头文件testDll.h,本文介绍三种dll库生成的方法
动态生成库的关键字为__declspec(dllexport)
方法一和方法二的区别就是标识符是否被定义,如果标识符TESTDLL被定义则重新定义标识符TESTDLLAPI,并使用重新定义的标识符进行函数导出;如果标识符TESTDLL未被定义,则使用当前定义的标识符进行函数导出。extern "C" 的作用是进行C扩展,因为不加这一句有时候会导致导出的函数名不是写的函数名。如下:
当然也可以使用方法三进行函数导出,但是为了方便调试,推荐前两种方法。
使用方法一和方法二这种条件预编译指令的好处也可以方便动态库的导入。一般情况下,使用方法一进行动态库导出时,会执行#define TESTDLL __declspec (dllexport),表示库导出;动态调用时,由于标识符TESTDLL被定义,会执行#define TESTDLL __declspec (dllimport)进行动态库导入。
(4)修改源文件testDll.cpp
(5)编译运行
1.2、动态库的创建(使用DEF 文件 (*.def) )
参考:使用 DEF 文件从 DLL 导出 | Microsoft Docs
操作方法如下:
testDef.h文件如下:
testDef.cpp文件如下:
Source.def文件如下:
工程属性设置如下:
测试工程同动态库调用。
2、动态库的调用
(1)同静态库测试一样,创建测试工程test,介绍两种动态库调用方法
使用隐式调用时,需要在项目连接器→附加库目录中加入lib文件的地址(同静态库调用)
(2)编译运行
至此,动态库创建及调用讲解完毕。
如果内容讲解不到位,希望各位指正。