C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)

C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)

1. 首先,如何制作一个静态库(lib)?

额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件。之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去手动打包到我们的可执行文件当中。我们知道,打包一个文件,里面的东西非常之多,当我们加载时,内存会被很多的代码块锁占用,因而常常有一种,调用一个函数,而不得不去读取一大片的代码块儿的感觉。这就是静态库的缺点没有之一

就像写一个这样的程序:

代码语言:javascript复制 1 #include

2 #include

3 #include

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");即可!

然后调用代码如下:

代码语言:javascript复制 1 #include

2 #include

3 #include

4

5 #pragma comment(lib,"staticlib.lib") //引入一个静态库

6

7 int main(int argv ,char args []){

8

9 meg("你好!");

10 printf("%d\n",_max(3,4));

11 getchar();

12 return 0;

13 }2。 而动态库的使用,则刚好避免了静态库这一个庞大而强占大量内存的缺点,它封装了每一个函数,作为一个接口,当我们需要哪个的时候,就可以读取哪个函数的代码到内存块中,占用的内存相对的小很多。那么如何生成一个dll呢?

关于动态库的生成方式和lib差不离,将属性改为 将Application (.exe) 改为 dll即可

不过在定义函数时需要在前面加载: declspec(dllexport)

代码如下:

代码语言:javascript复制 1 #include

2 #include

3 #include

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函数地址。 如下面的代码:

代码语言:javascript复制 1 #include

2 #include

3 #include

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

希望被很多的应用使用,需要经常的更新功能,经常被用来使用做劫持别人的文件。

相关推荐

vb.net - 在 Visual Basic Windows 窗体中加载 pdf 文件?
沙巴体育365体育网站

vb.net - 在 Visual Basic Windows 窗体中加载 pdf 文件?

📅 01-06 🔥 296
[热点内容]史诗之路暗改!新增20W=30张深渊票,可跨界恍惚首饰
钎焊材料行业上市公司有哪些?(2023/10/12)
365bet充值方式

钎焊材料行业上市公司有哪些?(2023/10/12)

📅 07-11 🔥 150
为什么一到春天就更想谈恋爱?
28365365体育投注

为什么一到春天就更想谈恋爱?

📅 08-29 🔥 655
如何打印个人工资流水? 不论是工资流水还是银行卡的所有转入转出记录,不必去银行柜台办理,在对应的手机银行就能获取所需的银行流水。本文以 建设银...
羌字起名,羌五行属什么,羌字取名字的含义
沙巴体育365体育网站

羌字起名,羌五行属什么,羌字取名字的含义

📅 01-07 🔥 752