静态库和动态库的分析

16 篇文章 0 订阅
14 篇文章 0 订阅

学习笔记,小白可以相互学习,大佬看到能告诉咱理解不对的地方就好了。


库的概念:

从本质上来说库就是一种可执行代码的二进制形式,可被操作系统载入内核执行。

linux和windows本质不同,二者库的二进制是不兼容的。


1.静态库

静态库在程序编译时才会被连接到目标代码中,程序运行时不需要该静态库,因此体积较大

优点:静态库对函数库的链接是放在编译时期完成的,程序运行时与函数库没关系,移植方便。

缺点:浪费空间和资源,因为所有相关的对象文件与牵涉到的函数库被链接合成一个可执行文件。


1.1创建静态库

创建静态库使用ar命令,它将很多.o转换成.a

a. gcc -c hello.c (生成hello.o文件(目标文件))

b. ar crs libmyhello.a hello.o(把目标文件生成库,myhello是库名)

静态库的命名规范是以lib为前缀,紧接着接静态库名,扩展名为.a

c. gcc -o hello main.c -L -lmyhello(编译时记得链接库)


2.动态库

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。动态库把对一些函数的链接载入延迟到程序运行的时期。

优点:可以实现进程之间的资源共享,将一些程序的升级变得简单,甚至可以做到链接载入完全由程序员在程序代码中控制。


2.1创建动态库

a. gcc -fPlC -Wall -c hello.c(生成目标文件)

b. gcc -shared -o libmyhello.so hello.o(生成库文件)

动态链接库的名字形式为“libxxx.so”,后缀名为.so


2.2使用动态库的方法

1.cp limyhello.so /usr/lib/(直接把库拷贝到/usr/lib目录下)

2.在LD_LIBRARY_PATH环境变量中加上库所在路径

设置路径:export LD_LIBRARY_PATH = /home/farsight/hello(这个是库所在的目录路径,可使用命令pwd查看当前路径)

gcc test.c -lmyhello -L就可以了

3.添加/etc/ld.so.conf.d/*.conf文件,把库所在路径加到文件末尾,并执行ldconfig刷新

建立sudo vim /etc/ld.so.conf.d/*.conf 文件

再sudo ldconfig刷新

再gcc test.c -lmahello -L编译

最后直接./a.out执行就可了


ldd命令可以查看一个可执行程序依赖的共享库

#ldd /bin/inlibc.so.6

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值