Linux下静态库、动态库的创建和使用

静态库、动态库的创建和使用
1.按照如下目录,建立如下文件
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

2.创建静态库
这里写图片描述
创建lib文件夹,用来存放库文件
这里写图片描述
这里写图片描述

这里写图片描述

编译连接,生成可执行程序:

这里写图片描述
显示目录和文件:
这里写图片描述
静态库:app放到哪里都可以运行,因为静态库已经编译到app中,也导致其代码体积庞大
动态库:运行的电脑需要有动态库,且版本号要一致,但是其代码体积小。

  1. 创建动态库(共享库)

这里写图片描述

gcc -shared -Wl,-soname,libmycal.so.1 -o libmycal.so.1.0.1 a.o b.o

按照共享库的命名惯例,每个共享库有三个文件名:real name、soname和linker name。
真正的库文件(而不是符号链接)的名字是real name,包含完整的共享库版本号。

soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函数的接口一致,因此应用程序的.dynamic段只记录共享库的soname,只要soname一致,这个共享库就可以用。如libmyab.so.1和libmyab.so.2是两个主版本号不同的libmyab,有些应用程序依赖于libmyab.so.1,有些应用程序依赖于libmyab.so.2,但对于依赖libmyab.so.1的应用程序来说,真正的库文件不管是libmyab.so.1.10还是libmyab.so.1.11都可以用,所以使用共享库可以很方便地升级库文件而不需要重新编译应用程序,这是静态库所没有的优点。注意libc的版本编号有一点特殊,libc-2.8.90.so的主版本号是6而不是2或2.8。

linker name仅在编译链接时使用,gcc的-L选项应该指定linker name所在的目录。有的linker name是库文件的一个符号链接,有的linker name是一段链接脚本。例如上面的libc.so就是一个linker name,它是一段链接脚本.

这里写图片描述

此时找不到动态库
这里写图片描述

a.需要设置共享库的加载路径:
这里写图片描述
b.打开后添加最后一行:
这里写图片描述
c.更新共享库加载路径:
这里写图片描述
查看:
这里写图片描述

再次编译连接:
这里写图片描述
可以手动添加link name:
这里写图片描述

这里写图片描述

执行程序:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值