C/C++ 之 库


静态库和动态库的区别:

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;

动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。  


静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。


1.制作静态库

[root@localhost Learn]# vim static_lib.c

书写库内容如下:
int add(int a,int b)
{
    return a+b;
}

编译,生成目标文件static_lib.o

[root@localhost Learn]# gcc -c static_lib.c

使用ar工具创建静态库

[root@localhost Learn]# ar rcs static_lib.a static_lib.o 
生成了static_lib.a,其中r参数表示将目标文件加入静态库,c参数表示若库不存在则创建这个库,s参数表示更新静态库的文件索引,使之包含新加入的目标文件的内容。
写static_lib.h文件
int add(int a,int b);

写main.c文件
#include<stdio.h>
#include"static_lib.h"
int main()
{
  int a = 2;
  int b = 3;
  printf("%d + %d = %d\n",a,b,add(a,b));
}

生成可执行程序
[root@localhost Learn]# gcc main.c static_lib.a -o app
[root@localhost Learn]# ./app
2 + 3 = 5
[root@localhost Learn]# ldd app 
	linux-vdso.so.1 =>  (0x00007fffd8b7b000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003248200000)
	/lib64/ld-linux-x86-64.so.2 (0x0000003247a00000)

ldd  是用来查看链接那些动态链接库。

2.动态库的建立

我们将之前static_lib.c内容制作一个动态库,为了区分,复制一份
[root@localhost Learn]# cp static_lib.c share_lib.c
[root@localhost Learn]# gcc -shared -fPIC -o share_lib.so share_lib.c 

-fPIC选项用于生成位置无关的代码,share选项将位置无关代码制作为动态库。
生成可执行文件

[root@localhost Learn]# gcc main.c ./share_lib.so -o app_share
[root@localhost Learn]# ./app_share 
2 + 3 = 5
[root@localhost Learn]# ldd app_share 
	linux-vdso.so.1 =>  (0x00007ffff073e000)
	./share_lib.so (0x00007f8aeb12f000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003248200000)
	/lib64/ld-linux-x86-64.so.2 (0x0000003247a00000)






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值