【Linux】编译动态库与静态库

1.静态库与动态库的概念

静态库(.a):程序会在编译链接的时候把代码链接到可执行文件中,程序在运行的时候不再需要静态库。

动态库(.lib):程序在运行的时候才链接库,所以一个动态库可以被多个程序共享。

链接动态库仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。

在可执行程序运行时外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个 过程称为动态链接(dynamic linking)。

动态库采用链接的方式,从而可以让可执行文件更小,节约了磁盘空间。

2.生成静态库

生成静态库
ar -rc libmymath.a add.o sub.o 
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表
ar -tv libmymath.a 
 add.o
 sub.o
t:列出静态库中的文件
v:verbose 详细信息
gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行

3.生成动态库

shared: 表示生成共享库格式

fPIC:产生位置无关码

库名规则:libxxx.so

例如:

  1 d-lib=libtest.so                                                                                       
  2 
  3 $(d-lib):add.o sub.o
  4   gcc -shared -o$@ $^
  5 
  6 %.o:%.c
  7   gcc -fPIC -c $<
  8 
  9 .PHONY:clean
 10 clean:
 11   rm -rf *.o *.a

要想使用动态库

可以添加编译选项

l:链接动态库,只要库名即可(去掉lib以及版本号)

L:链接库所在的路径.

-lm表示要链接libm.so或者libm.a库文件

库文件名称和引入库的名称 如:libc.so -> c库,去掉前缀lib,去掉后缀.so,.a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值