19 静态库和共享库

本文详细介绍了静态库(.a文件)和共享库(动态库)的差异,包括它们的使用场景和优缺点。静态库在编译时直接链接到应用中,而共享库在运行时动态加载。创建静态库使用`ar`命令,共享库则需要`gcc -shared`。此外,还阐述了如何制作静态库和共享库的步骤。

写的非常详细!

静态库可以认为是一些目标代码的集合。按照习惯,一般以“.a”做为文件后缀名。使 用ar(archiver)命令可以创建静态库。因为共享库有着更大的优势,静态库已经不经常使用。但静态库使用简单,仍有使用的余地,并会一直存在。有些Unix系统,如Solaris 10, 已经基本废弃了静态库。

静态库在应用程序生成时,可以不必再编译,节省再编译时间。但在编译器越来越快的 今天,这一点似乎已不重要。如果其他开发人员要使用你的程序,而你又不想给其源码,提供静态库是一种选择。从理论上讲,应用程序使用了静态库,要比使用动态加载库速度快 1-5%,但实际上可能并非如此。由此看来,除了使用方便外,静态库可能并非一种好的选择。

要创建一个静态库,或要将目标代码加入到已经存在的静态库中,可以使用以下命令:
ar rcs libmylib.a file1.o

file2.o以上表示要把目标码file1.o和file2.o加入到静态库libmylib.a中(ar的参数 r)。若libmylib.a不存在,会自动创建(ar的参数c)。然后更新.a文件的索引,使之包含新 加入的.o文件的内容(ar的参数s)。

Add.c

int Add(int a,int b)
{
  return a+b;
}

Sub.c

int Sub(int a,int b)
{
   return a-b;
}

Common.h

int Add(int a,int b);
int Sub(int a,int b);

main.c

#include "Common.h"
int main()
{ 
  printf("%d",Add(4,7));
  printf("%d",Sub(5,1));
  return 0;
}

一、静态库和共享库的区别

静态库在编译的时候被加载,而共享库在执行之后才被加载
加载静态库编译所生成的可执行文件比使用共享库的方式要大
静态库以.a为后缀,共享库以.so为后缀

二. 静态库的制作
1.gcc -c Add.c 生成.o文件
gcc -c Sub.c 生成.o文件(编写源文件,gcc -c命令生成对应的目标文件a.o和b.o)
2.生成静态库:ar rcs libmycal.a Add.o Sub.o
3.gcc main.c libmycal.a -o app(编写可执行程序app)

三.共享库的制作:

  1. gcc -fPIC -c a.c
    gcc -fPIC -c b.c(编写源文件,gcc -c命令生成对应的目标文件a.o和b.o)
    2.gcc -shared -Wl,-soname,libmyab.so.1 -o libmyab.so.1.0.1 a.o b.o(生成共享库)
    3.共享库加载
    1.修改/etc/ld.so.conf
    sudo vi /etc/ld.so.conf
    添加你的共享库路径
  2. 更新查找共享库的路径
    sudo ldconfig -v
    3.测试你的程序可否找到共享库
    ldd a.out

1)第一个是共享库的实际文件名(Real Name),
它是编译器产生共享库时或人为修改名字后的文件名,该实际文件名就是为了直观地控制共享库版本。
其格式为:lib + math + .so + 主版本号 + 小版本号 + 制作号
如:libmath.so.1.1.1234。

lib 是 Linux 系统上的库的约定前缀名,
math 是库自已的名字,
so 是共享库的后缀名,
1.1.1234 是共享库的版本号,格式:主版本号 + 小版本号 + 制作(build)号。主版本号代表当前共享库的版本,如果共享库提供的接口函数有变化的话,那么这个版本号就要加1;小版本号 ,如果引入了新的特性(Feature)的话,那么这个版本号就要加1;制作号, 一般仅表示修正了Bug。

2)第二个是共享库的简短文件名(soname - Short for shared object name),它是可执行程序加载它时,要寻找的文件名。
其格式为:lib + math + .so + 主版本号
如:libmath.so.1
注:在编译链接生成一个实际文件名的共享库时,同时也将简短文件名写进了共享库的文件头里面。
可以用此命令来查看:$readelf -d 共享库的实际文件名

3)第三个是共享库的连接文件名(Link Name),是专门为可执行程序生成阶段链接共享库时用的名字,不带任何版本信息的。
其格式为:lib + math + .so
如:libmath.so。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值