动态链接库与静态链接库
目录
1.静态链接库
1.1创建方法
-
打开Vs2017
![]()
-
添加cpp和.h文件,并在cpp包含.h文件
-
cpp中写代码
![]()
-
在.h文件中声明
![]()
-
编译
1.2使用方法
-
将生成的.lib文件和.h文件复制到需要使用的工程目录下
![]()
![]()
-
放到这里
![]()
-
从工程中导入并包含.h文件
-
声明需要用到的lib 方法1 :
![]()
-
声明需要用到的lib 方法2:
![]()
项目属性中添加lib库
- 效果
![]()
![]()
1.3总结
优点
- 使用很方便
缺点
- 代码被直接编译到当前PE文件中,一旦对lib代码进行了扩展,exe文件也需要进行重新编译了。
2.动态链接库
2.1编写方法
-
打开vs2017,新建
![]()
-
在cpp中写代码
![]()
2.2 导出方式 1 _declspec(dllexport)
-
在.h中 声明导出
![]()
-
生成 在LordPE中查看
![]()
2.3 导出方式 2 def文件声明
-
新建一个def文件 写
![]()
-
编译 在LordPE中查看
![]()
2.4 总结
- extern "C"
- 使用了extern"C"导出的函数能正确识别函数名(防止名称粉碎)
- 未使用 extern"C"导出的函数名称会变得不一样(名称粉碎)
- 调用约定
- 使用了 stdcall的函数名前会加一个“_”
- 最好 使用stdcall 因为它是内平栈,不需要再修改EXE
- 使用_declspec( dllexport )
- 说明本文件是导出文件
- def声明导出
- 函数个数变多了
- 函数名都可以正常识别
- 写了NONAME的没函数名
- 函数的序号和def文件中写的@相同
3.使用方法
3.1隐式链接
- 将 .h .dll .lib 放到要使用的工程目录下
- 包含 .h 导入lib
- 运行
![]()
3.1显式链接
- 定义函数指针
- 使用 LoadLibrary 加载dll
- 使用GetProcAddress 找到需要的函数地址
- 将函数地址赋值给函数指针变量
- 使用这个函数指针
- 使用方法
![]()
4对比
- 可扩展性动态库比静态库要好。只要编译DLL就行



















浙公网安备 33010602011771号