当前位置:   article > 正文

C语言(3)静态库(lib)、动态库(dll)_c语言lib库

c语言lib库

1、模块

什么是模块,就是动态链接库,俗称DLL

与之对应的是静态链接库,俗称lib
  • 1
  • 2
  • 3

打开火绒剑,查看每一个线程都是一个dll

在这里插入图片描述
即程序都依赖于dll运行,主要是win的api函数让你必须使用动态链接库

1.1、静态链接库
先生成多个obj文件,然后用工具将很多个obj文件合成一个lib文件。

	将函数直接定义在obj文件内,程序使用直接导入lib文件,

	在程序内,直接使用函数名即可,程序会自动去lib文件内去寻找,
  • 1
  • 2
  • 3
  • 4
  • 5
lib的缺点:

	某lib文件A内有一个打印功能的函数,(打印功能函数大小5kB)

	程序a需要用,要将打印功能的函数包含进来(程序a有100Kb)

	程序b也用到,。。。。。。。。。。。。

	。。。。。。。。。

	。。。。

	一万个程序都需用到“打印功能函数”,都需要将“打印功能函数”包含进来,


会造成大量磁盘空间的浪费;

另外假设“打印函数”更新了,所有已经编译的程序都需要重新编译,
	
	基于以上缺点,产生了动态链接库,即dll

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
1.2、动态链接库
这个就类似函数的作用,

	程序仅仅保存dll的位置,不会将具体的代码存放进去,

	仅仅会在程序运行的时候,才会将具体的代码加载进去,
  • 1
  • 2
  • 3
  • 4
  • 5

多个程序都使用同一个dll的时候,会通过“分页机制”去加载这个对应的DLL文件。

但是在物理内存之后,仅仅保存了一份。

程序使用DLL,需要描述清楚,使用的库的名称和函数的名称。
  • 1

另外动态链接库的名称不仅仅会是dll,还能是exe\fon(字体文件)\sys(驱动文件)\drv(驱动文件)\ocx(控件)等.

就是系统之中包含的共用代码模块都有可能是动态链接库。

1.3、如何写DLL(动态库
新建一个空项目(建议),
  • 1

在这里插入图片描述
先右击新建的项目做一些设置,然后在新建一个.c文件,
在这里插入图片描述
设置为启动项,
在这里插入图片描述
导出一个dll接口,
在这里插入图片描述
这个dll是无法直接像exe直接执行,使用DLL文件进行注入qq。

在注入之前可以使用火绒剑看看qq已经加载的dll文件是没有“naizigege.dll”的,

在这里插入图片描述

下边使用工具进行注入,(其实这个工具并不是太好用)

	主要是年份比较久了,很多进程无法获取到。
  • 1
  • 2
  • 3

在这里插入图片描述

动态链接库选择刚刚生成的dll文件,加载执行的函数就是dll内,我们定义的naizigege,
  • 1

在这里插入图片描述

等待缓缓加载冲一会边弹出了窗,
  • 1

在这里插入图片描述
注入之后,该dll会被当做qq进程的一部分,被调用。

使用火绒剑,可以直接看到,已经成功注入

在这里插入图片描述
这里也说明,在使用火绒剑的时候,看到这种“三五”产品大概率也是不正常的,

值得一提的是,这个工具还可以将已经注入的dll给卸载掉,
在这里插入图片描述

1.4、编写lib(静态库
先修改属性,
  • 1

在这里插入图片描述
在头文件,右击,创建新的头文件(naizi.h)
在这里插入图片描述
在新建函数体,具体内容如下,
在这里插入图片描述
生成lib,
在这里插入图片描述
生成的lib文件在项目文件夹下“debug文件夹内”
在这里插入图片描述
将lib文件先改名字为一个好记得,比如下图,
在这里插入图片描述
如何加载使用lib呢?

将生成的lib与头文件都放到一个新建test文件夹下面,
  • 1

在这里插入图片描述
新建一个项目;右击头文件,添加“现有项”,将复制过来的naizi.h加进入,
在这里插入图片描述
创建“源文件”demo.c,具体内容如下。

此时虽然没有直接报错,但是直接运行的话就弹出了错误。

在这里插入图片描述
这是因为仅仅导入了h头文件,还没有导入lib文件。先选择lib文件的位置。
在这里插入图片描述
此时还行需要在这里加一下“madou.lib;”这样lib文件就导入完成。
在这里插入图片描述
然后,直接运行会弹出10,
在这里插入图片描述
其他建议:

使用自己的lib文件夹,建议将自己的lib头文件引入(上图之中没有导入),

即在上图的第2行导入以下内容;导入自己写的lib文件,不用尖括号而使用双引号。
  • 1
  • 2
  • 3
#include "naizi.h"
  • 1

lib的特别使用场景:

不想给别人看到函数实现的代码,就给对方一个生成好的lib文件,

一个头文件(注释写好使用方法)
  • 1
  • 2
  • 3

遇到错误:

一个项目最终还是没有输出,这个主要是我们之前配置了项目隐藏程序的黑窗口,导致没有显示。

新建一个项目同样的流程解决,
  • 1
  • 2
  • 3

2、goto

goto一般可以理解为跳转;

先整一个“死循环”模拟while循环,
  • 1
  • 2
  • 3

在这里插入图片描述

这个是运行2S的效果截图;值得一提的是,上图的“s”变量名称是自定义的(任意)。
  • 1

在这里插入图片描述

也可以指定次数,模拟for循环
  • 1

在这里插入图片描述

这个goto与递归挺像的,自己调用自己。
  • 1

在这里插入图片描述
坑点:

下边的go函数体正常要放到main函数的上边,不然可能会找不到。

或者使用上图的方法,在前边先声明go函数。
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/128715
推荐阅读
相关标签
  

闽ICP备14008679号