区别动态链接库和静态链接库

动态链接库和静态链接库:

首先理解两种生成可执行程序的链接方式:

动态链接:

链接动态库,只是在生成的程序中记录库中的函数信息表,并没有将具体代码实现写入程序中,所以依靠动态链接生成的程序在运行时,需要依靠动态库的存在

具体实现代码在内存中共享,不存在代码冗余

静态链接:

链接静态库,在生成的程序中直接将库中所需要的函数代码实现直接拷贝到执行程序中,导致生成的程序所占空间比较大,但无需任何依赖,方便移植

库的生成步骤:

  1. 将源码经过汇编编译后,生成二进制指令

          gcc -fPIC -c testlib.c -o testlib.o

注:-fPIC选项的意义:是为了产生位置无关代码    在进行汇编编译时,此时代码中的所调用的库函数都是记录了相对库在内存中映射起始地址的偏移量,即每一个库函数地址并不确定,而是根据映射后库的起始地址+偏移量来寻找对应的函数地址进行调用。

     2.将编译完成后的二进制指令组织打包成为库文件

  • 动态库:gcc  --shared testlib.o ... -o libtestlib.so
  • 静态库:ar -cr  libtestlib.a   testlib.o ...

库的使用:

  • 生成可执行程序时链接使用:使用-l选项指定要链接的库名称

       gcc  main.c  -o  main  -ltestlib

      使用注意事项:

      1.库文件必须放在指定路径下:/usr/lib64  (gcc链接器会 在默认路径下去找对应的库)

      2.设置环境变量:export  LIBRARY_PATH=$LIBRARY_PATH:/  (设置环境变量  库地址路径为当前路径)

      3.使用gcc的 -L 选项指定库路径:gcc  main.c -o  mian  -L./  -ltestlib

  • 运行可执行程序时加载使用:仅针对动态链接生成的程序

使用注意事项:

      1.库文件必须放在指定路径下:/usr/lib64  (gcc链接器会 在默认路径下去找对应的库)

      2.设置环境变量:export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/  (设置环境变量  库地址路径为当前路径)

综上:gcc  默认优先选择动态库进行链接,无论是在生成可执行程序以及运行程序时都需要保证库的路径明确(包括放在指定路径下或设置环境变量为当前路径)  但这仅仅是针对动态链接库,如果是静态库比较常用的为-L选项进行链接

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HT . WANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值