牛客Linux高并发服务器开发学习第三天

静态库的使用(libxxx.a)

将lession04的文件复制到lession05中

lib里面一般放库文件 src里面放源文件。

将.c文件转换成可执行程序

gcc main.c -o app

main.c当前目录下没有head.h

gcc main.c -o app -I ./include 

利用-I 和head所在的文件夹,找到head。

main.c用到了库里面的东西,但是没有找到,因此需要使用

gcc main.c -o app -I ./include -l calc -L ./lib 

在./lib文件夹中 找calc库文件 

回顾静态库制作和使用

目前文件夹中具有头文件、主函数文件、函数源文件。

先把函数源文件编译汇编成.o文件

gcc -c add.c div.c mult.c sub.c 

由于头文件在include文件夹里 需要在后面加上 -I ../include/

然后将.o文件打包制作成静态库

ar rcs libsuanshu.a add.o div.o mult.o sub.o 

ar rcs [库名] [*.o]

并且将静态库移动到库文件夹中

mv libsuanshu.a ../lib

编译main.c 为suanshu程序

gcc main.c -o suanshu -I ./include -l suanshu -L ./lib

-o [输出文件名] -I [头文件路径] -l [库名称] -L[库文件路径]

动态库(共享库)的制作(libxxx.so)

命名规则:

Linux:libxxx.so

Windows:libxxx.dll

gcc 得到.o文件,得到和位置无关的代码

gcc -c -fpic/-fPIC a.c b.c 

gcc 得到动态库

gcc -shared a.o b.o -o libcalc.so

动态库的使用

加载共享库时出现了错误,不能打开共享文件,虽然制定了库的目录,但找不到这个动态库。

动态库实现原理

静态库进行GCC链接时,会把静态库中的代码打包到可执行程序中。

动态库进行GCC链接时,动态库的代码不会打包到可执行程序中。

程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamic dependencies)命令检查动态库依赖关系。

1.通过配置动态库环境变量解决main找不到动态库

临时环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljy/Linux/lession06/library/lib

lld可以找到动态库的依赖关系,可以运行main。

重新打开终端,环境变量就失效了,这个配置是临时的。

用户级别上配置

可以在用户级别上配置,编辑~/.bashrc,在文件最后加上

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljy/Linux/lession06/library/lib

重启终端后,main文件仍可以找到动态库。

在.bashrc中删除最后一句,source ~/.bashrc,回到main的位置,可以发现main又找不到动态库了

系统级别上配置,需要root权限

编辑/etc/profile,在文件最后加上

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljy/Linux/lession06/library/lib

2.通过ld.so.cache文件列表

利用sudo编辑ld.so.conf文件,在里面加上动态库的路径,再用sudo ldconfig更新。

3.将动态库文件放入/lib/ /usr/lib目录中

什么时候使用动态库静态库。

文件比较小使用静态库,文件比较大使用动态库。

静态库优缺点

优点:静态库被打包到应用程序中加载速度快。发布程序无需提供静态库,移植方便。

缺点:消耗系统资源,浪费内存,更新、部署、发布麻烦。

动态库优缺点

优点:可以实现进程间资源共享(共享库),更新、部署、发布简单,可以控制何时加载动态库。

缺点:加载速度比静态库慢,发布程序时需要提供以来的动态库。

学习进度

Linux系统编程入门 02:34:20

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值