C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)
1. 首先,如何制作一个静态库(lib)?
额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件。之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去手动打包到我们的可执行文件当中。我们知道,打包一个文件,里面的东西非常之多,当我们加载时,内存会被很多的代码块锁占用,因而常常有一种,调用一个函数,而不得不去读取一大片的代码块儿的感觉。这就是静态库的缺点没有之一
就像写一个这样的程序:
1 #include<stdio.h>
2 #include<string.h>
3 #include<windows.h>
4
5 void msg(char text[] ){
6 MessageBox(0, text, "title", 0);
7 }
8
9 int _max(int a , int b) {
10
11 return a > b ? a : b;
12 }
然后 将vs点击属性 --> 常规 -->Configuration Type 将Application (.exe) 改为Static library (.lib)就好了! 然后编译即可!
生成之后,将该lib文件放置于我们项目的目录中。在头文件初,#prama comment(lib,"cof.lib");即可!
然后调用代码如下:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4
5 #pragma comment(lib,"staticlib.lib") //引入一个静态库
6
7 int main(int argv ,char args []){
8
9 meg("你好!");
10 printf("%dn",_max(3,4));
11 getchar();
12 return 0;
13 }
2。 而动态库的使用,则刚好避免了静态库这一个庞大而强占大量内存的缺点,它封装了每一个函数,作为一个接口,当我们需要哪个的时候,就可以读取哪个函数的代码到内存块中,占用的内存相对的小很多。那么如何生成一个dll呢?
关于动态库的生成方式和lib差不离,将属性改为 将Application (.exe) 改为 dll即可
不过在定义函数时需要在前面加载: declspec(dllexport)
代码如下:
1 #include<stdio.h>
2 #include<string.h>
3 #include<windows.h>
4
5 _declspec(dllexport) void msg(char text[] ){
6 MessageBox(0, text, "title", 0);
7 }
8
9 _declspec(dllexport) int _max(int a , int b) {
10
11 return a > b ? a : b;
12 }
那么生成了dll之后,如何来调用这个dll呢? 调用dll没有像静态库那么简单的用一个宏命令就可以使用了,相反这个过程还是稍稍的繁琐了一些。
首先,我们需要定义一些函数指针,来指向这些dll函数地址。 如下面的代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<windows.h>
4
5 //定义一个函数指针类型
6 typedef void(*pmeg)(char []); //指向meg的一个指针
7 //定义一个函数指针类型
8 typedef int(*pmax) (int ,int ); //定义一个指向_max的指针
9
10 int main(int argv ,int args[]){
11
12 //定义了指针之后,我们需要使用widow API 来HMoDULE来定义一个模块
13 HMODULE mdll;
14 mdll = LoadLibraryA("dongdll.dll"); //加载dll文件,需要带路径
15 if (NULL == mdll) {
16 printf("dll加载失败");
17 return ;
18 }
19 else{
20 pmeg mymeg;
21 mymeg = (pmeg )GetProcAddress(mdll,"msg");
22 if (mymeg != NULL) {
23 mymeg("nihao");
24 }
25 else {
26 printf("没有相关函数! msg");
27 }
28 }
29 getchar();
30 return 0;
31 }
但是,对于平时我们平时为什么可以直接注入dll到相应的执行文件中呢? 是因为我们覆盖了我们执行文件的那块儿内存,所以在能够去run,我们给他加载的函数。
以上就是对于静态库和动态库的生成和调用的方法。
对于静态库和动态库的优缺点和使用用途:
dll和lib可以比作这样的公司: dll就像一个外包的公司,可以被任意的程序使用,而lib就像一个大公司下的一个研发部分,只能加载到文件中才能被使用。
1. dll------- 不需要更新执行文件,只需要更新dll文件 ,而lib,每次更新,需要重新编译源文件成执行文件。
2. dll 节约计算机资源,需要使用时加载,不需要使用时释放。 lib 浪费较多的资源,是软件的体积变得越来越庞大。
在这些情况下可以使用lib:
需要私有化,就是仅供自己使用时。不需要经常改动时文件时。
在这些情况下可以使用dll
希望被很多的应用使用,需要经常的更新功能,经常被用来使用做劫持别人的文件。
- iScroll5 表单元素无法失焦 解决方法
- ResNet原理及其在TF-Slim中的实现
- 了解你服务器的心情——top命令详解
- HTML5视音频代码实例 & WEBM格式转换器
- 解析Tensorflow官方PTB模型的demo
- MyBatis源码解析(一)——MyBatis初始化过程解析
- MyBatis源码解析(二)——动态代理实现函数调用
- Git命令速记
- linux设备驱动第三篇:如何写一个简单的字符设备驱动
- Tensorflow高级API的进阶--利用tf.contrib.learn建立输入函数
- Spring速查手册(三)——Spring+JDBC
- [WebKit] JavaScriptCore解析--基础篇(一)字节码的生成及抽象语法树的构建详情分析
- Spring速查手册(二)——Bean的作用域
- pyTorch自然语言处理简单例子
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kotlin 使用Lambda来设置回调的操作
- Kotlin之自定义 Live Templates详解(模板代码)
- Android Studio设置颜色拾色器工具Color Picker教程
- Kotlin中常见的符号详解
- Kotlin中实体类的创建方式
- Android自定义流式布局/自动换行布局实例
- Android 中 MD5 的几种生成方式(小结)
- Flutter 日期时间DatePicker控件及国际化
- 解决Kotlin 类在实现多个接口,覆写多个接口中相同方法冲突的问题
- Kotlin 匿名类实现接口和抽象类的区别详解
- android实现微信朋友圈发布动态功能
- 基于Android studio3.6的JNI教程之helloworld思路详解
- 基于Android studio3.6的JNI教程之opencv实例详解
- AndroidStudio代码达到指定字符长度时自动换行实例
- android studio 新建项目报错的解决之路