linux系统编程之静态库与动态库

本文深入解析静态库和动态库的创建与使用方法,包括它们的区别、如何生成及使用,以及在链接过程中的注意事项。文章还提供了具体的命令示例,帮助读者更好地理解并掌握链接库的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在工程中,我们能够经常看到xxx.a或者xxx.so文件, 以这两种命名结尾的就是链接库文件, .a结尾的为静态库链接文件, .so结尾的则为动态链接库文件。两者各有差异, 差异后面会细说。

静态库:

创建  -c是生成可重定位的ELF格式文件,如下图所示:

               

              然后就可以生成静态链接库了:

              // rc  (replace and  create)

              然后就生成了libdemo.a静态库文件了

可以使用ar tv llibxxx.a  查看归档中的目录表              

ar d libdemo.a  sub.o  从库中删除sub.o 文件

使用

                  //-L  为指定库路径    -l指定库名

动态库:

创建:

                 //-fPIC选项是指定编译器应该生成位置独立的代码

                //-Wall  是编译器警告选项

              然后就是生成动态链接库文件:

         

               //-shared 命令就是创建目标模块的共享库

有时候为了确认目标文件是否在编译时使用了-fPIC 选项, 可以用以下命令判断:

nm sub.o | grep  _GLOBAL_OFFSET_TABAL_   

或者 readelf -s sub.o | grep  _GLOBAL_OFFSET_TABAL_   

同理:也可以使用下面命令,如果产生了输出, 那么指定的共享库肯定有一个未指定-fPIC 选项。

objump --all-headers libdemo.so | grep TEXTERL

readelf -d libdemo.so | grep TEXTERL

使用: 大致与静态库使用一制, 但是需要指定库路径;

         不然会报以下错误:

这种错误就是在提示你, 该程序在默认路径未找到该链接库。这时候可以使用以下方法:

编译时使用  LD_LIBRARY_PATH=. ./main   这时系统是能够找到该链接库的

设置临时环境变量;export PATH="$PATH":  xxx

将库路径永久添加在~/.bashrc或者/etc/profile  脚本中

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值