链接库(静态库 共享库)

一 、库的概念

库:库是预先编译好的方法的集合。

库文件常存放的地点为/lib 或者 /usr/lib,库对应的头文件一般放在/usr/include 中.

在linux 中库的命名一般为: libxxx.a(静态库)
                                             ibxxx.so(共享库)

二、静态库的生成

有两个方法 int add(int x, int y),int max(int x, int y) 分别在两个文件 add.c 和 max.c 中。

#include<iostream>

int add(int a,int b)
{
    return a+b;
}
#include<iostream>

int max(int a,int b)
{
    return a > b;
}

则静态库生成过程如下:

1) 将所有.c 源文件处理成.o 目标文件

gcc -c add.c 生成 add.o
gcc -c max.c 生成 max.o

2) 对生成的.o 目标文件打包生成静态库
假设静态库的名字为 libfoo.a

ar crv libfoo.a add.o max.o 其中 ar 是做库的命令,c 是创建库,r 是将方法添加到库里 v 显示过程,可以不要

三、共享库的生成

1)将所有的源文件处理成.o 目标文件

gcc -c add.c 生成 add.o

gcc -c max.c 生成 max.o

2) 对生成的.o 文件处理生成共享库,假设共享库的名字为 libfoo.so

gcc -shared -fPIC -o libfoo.so add.o max.o 

四、静态库与共享库的使用

gcc -o main main.c -L/usr -lfoo 其中-l 指定的是库名,注意没有库的前缀和后缀    -L 指定路径

 五、静态库与共享库的区别

静态库:编译链接时,包含到可执行程序中。

共享库:编译链接时,只做标记,没有包含,在运行程序的时候动态链接;
              编译完成生成的.o文件中的方法地址没有确定,在链接时才确定方法(符号)地址。
              LD_LIBRARY_PATH 指定动态链接的库,可以改变环境变量,程序运行时,优先在给变量指定的位置寻找库

六、关于库的linux命令

ldd main 查看某个程序使用哪些共享库

 七、两种库的应用

1)静态库:如果有一个程序用到了某一个库,但是将这个代码给别人使用时,别人没有这个库,所以在其他人的主机上就不能运行该程序,由于静态库是在编译时期直接嵌入到源程序中的,所以它在编译时期将所有的库已经集成到文件中,所以不需要再次取链接,就不会出现找不到库的问题;
但是静态库这样的做法,导致了占用系统空间很大,而且如果发现了bug就必须得重新进行编译链接,对于一写大型的项目来说很不友好。

2)共享库,共享库是在链接时进行链接的,所以只需要将编译打包好的库保留一份,就可以用了,移植性很好,解决的静态库的占用系统空间以及产生bug不好修改的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值