静态库和共享库(动态库)

一、库的概念

库是一个二进制文件,包含的代码可被程序调用。包括标准C库、数学库、线程库…… 库有源码,可下载后编译;也可以直接安装二进制包。

Linux中的库保存在/lib /usr/lib路径中。

库是事先编译好的,可以复用的代码。 在OS上运行的程序基本上都要使用库。使用库可以提高开发效率。 Windows和Linux下库文件的格式不兼容,Linux下包含静态库和共享库。

二、静态库

 编译(链接)时把静态库中相关代码复制到可执行文件中

优点

1、程序中已包含代码,运行时不再需要静态库

2、程序运行时无需加载库,运行速度更快

缺点

1、占用更多磁盘和内存空间

2、静态库升级后,程序需要重新编译链接

(1)、静态库创建

确定库中函数的功能、接口

编写库源码

编译生成目标文件      $ gcc  -c  库源码.c  -Wall

创建静态库 hello        $ar -rsv lib静态库名字.a 目标文件.o

查看库中符号信息

(2)、链接静态库

编写应用程序test.c

编译test.c 并链接静态库libprint.a      

$gcc  -o  test  test.c  -L.  -l静态库名字(不包含lib前缀和.a后缀)     

运行可执行文件 $ ./test       hello  world!

三、共享库 (动态库)

编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码

优点

1、程序不包含库中代码,尺寸小

2、多个程序可共享同一个库

缺点

1、程序运行时需要加载库

2、库升级方便,无需重新编译程序

3、使用更加广泛

(1)、共享库创建

确定库中函数的功能、接口

编写库源码(同上)

 编译生成目标文件      $ gcc  -c  -fPIC  库源码.c  -Wall

生成与位置无关的目标文件

创建共享库        $ gcc  -shared  -o  lib共享库名字.so  目标文件.o 

(2)、链接共享库

编写应用程序test.c

编译test.c 并链接共享库libprint.so        $  gcc  -o  test  test.c  -L.  -l共享库名字(不包括lib前缀和.so后缀)

$./test 执行后找不到共享库

(3)、加载共享库

添加共享库的加载路径    $  export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.    

$ ./test      执行后打印 Hello  World!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值