TTTTTTTZZZZZZZ(系统编程--动态库,静态库)7

动态链接库:.dll文件
把一些.c/.cpp文件编译成了一种特殊的二进制程序,自身并不能被执行,但是可以被其他的可执行程序调用
应用场景:客户端更新的时候不必更新整个程序,而是更新其中的一部分模块,其中就是以动态库的方式组织的。我们的
一个游戏很大,但是每次更新的时候貌似只需要更新很小的内存,原因就是将整个程序分成很多的模块,用的时候再去调
用,更新的时候也只需要更新几个模块就可以了,而不是全部更新,而这些模块就是通过动态库的方式来组织的
静态链接库:
把一些.o(就差最后一步链接就可以生成可执行文件的文件)文件打包生成一起生成了一种特殊的二进制程序,
自身不能直接执行,但是可以和其他的.c/.cpp文件编译生成一个新的可执行程序

这个新的可执行程序就可以单独发布了。
应用场景:发布较小的程序的时候,可以使用静态库的方式编译生成一个单独的执行程序并不依赖其他的库。发布比较方便

===========================================================================
静态库和动态库的命名规则:
lib前缀
.a后缀(静态库)
.so后缀(动态库)
制作个静态库

//test1.c文件
  1 #include<stdio.h>
  2 #include<unistd.h>
  3 extern int add(int x,int y);                                                                                                      
  4 int main()
  5 {
  6   int ret = add(10,10);
  7   printf("%d",ret);
  8   return 0;
  9 }
//add.c文件
  1 int add(int x,int y)
  2 {
  3   return x + y;                                                                                                                   
  4 }
//makefile文件
  1 test:test1.c libadd.a   //用依赖文件生成目标文件,此时test1.c,libadd.a就是依赖文件
  2   gcc $^ -o $@
  3 libadd.a:add.c      //生成静态库文件
  4   gcc -c add.c -o add.o  //add.c -o 生成静态库文件
  5   ar -rc libadd.a add.o  //将静态库文件全部打包成一个大的静态库文件,叫libadd.a静态库文件
  6    //因为我们只有一个静态库文件所以看不出什么效果,当.o文件比较多的时候,打包起来就比较方便
  
  7 .PHONY:clean
  8 clean:                                                                                                                            
  9   re test

make之后我们就可以发现目录下的文件分成了三类,此时
绿色的就是最终的可执行文件
红色的就是静态库文件,而libadd.a就是打包了所有的静态库文件生成的一个大的静态库文件
橙色的就是源代码和makefile文件
在这里插入图片描述

===========================================================================
动态库的生成:
其他文件和静态库都一样,只需要把makefile文件进行修改就可以了

//makefile文件
  1 test:test1.c libadd.so
  2   gcc $^ -o $@
  3 libadd.so:add.c
  4   gcc  add.c -shared -fPIC -o libadd.so                                                                                           
  5 .PHONY:clean
  6 clean:
  7   re test

橘色框起来的就是动态库文件
白色的就是最终的可执行的程序
其他的都是源文件
在这里插入图片描述
静态库和动态库的区别:

但是但是,我们自己生成的动态库可能会无法正常打开,也就是动态库名明明存在,但就是提示找不到
此时要对系统的文件进行修改,但是学习的时候不要用弄,自己知道咋搞就行了
linux下动态库找不到的三种解决方案

依赖动态库生成的可执行文件,在运行的时候必须要动态库文件就在当前目录,不然不能直接运行
而静态库在生成可执行程序之后就可以将静态库移除了
因为依赖静态库在生成可执行程序的时候已经将根据需求将静态库的东西已经拷了过去
而动态库只是在可执行程序的相对位置,记录下调用的动态库中的函数的位置,等到执行到某一部分的时候,他还要
回到动态库文件去执行,也就是说,执行的时候,动态库必须和可执行文件同时存在一个目录下

依赖静态库生成的可执行文件比依赖动态库生产成的可执行文件大,因为一个是可以单独执行的,
一个是要依赖动态库的可执行文件,假如动态库和可执行文件不在同一个目录之下,那么将无法执行

可以使用 ldd + 可执行程序名 可以查看一个可执行程序所依赖的动态库的关系

特殊的环境变量:LD_LIBRARY_PATH : 系统默认的去哪些目录中去找动态库

C++的第三方库一般都需要通过源码编译生成动态库或者静态库,才能使用,但是由于编译环境的差异,编译过程出现问题的概率极大,这个过程特别痛苦,我都想转JAVA了

使用ls -l查看当前目录的详细信息
包含七列
1.文件类型,权限
2.硬链接数
3.文件所有者
4.文件所有组
5.文件大小(假如是文件就是文件大小kb单位,是目录就是目录中文件的个数)
6.最后修改时间
7.文件名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值