Linux .a .so 整理记录

在Linux系统下,

  • .a 是静态库,是直接把一坨 .o打包起来的一个库,反向也是可以的,有工具可以把.a重新分开成单独的.o;
    • 生成静态库命令例如:/home/utils/binutils-2.33.1/bin/ar crs libcmod.a …/subadd.cpp …/subsub.cpp
  • .so 是动态库,动态库的好处也是个老生常态的话题了,比如对库的使用着来讲更友好, 如果仅仅是库更新的话,不需要库的使用者重新编译自己的程序;再比如如果该库会被很多程序使用的话,使用 .so可以节省内存,因为只需要把该 .so load一份到内存中,所有的程序共享该 so即可,当然该 so 对应的数据段还是每个程序独有的,只是把代码段共享了。
    • 生成动态库命令例如:/home/xx/GCC/gcc-9.3.0-binutils-2.33.1/bin/g++ …/fmod.cpp -fPIC -shared ./libcmod.a -o libfmod.so

如果说同时提供了 .a 和 .so,如何取舍呢?

  • 如果link .a的话,简单来讲,去link .a, 和直接在程序的link命令里 增加一个个的 .o 没什么区别,并且,还有个好处,链接器只会使用那些被用到的 .o, 没被用到的就丢弃了。
  • 如果link .so的话,就复杂一写,如果你要link该.so来生成一个可执行文件的话,那么在最后的link阶段,该so里面所有的符号必须要有定义,否则的话,会报undefined symbol error,这和 .a是不同的。当然如果你仅仅是需要link so,来生成另外一个 .so, 那在link阶段没问题,能成功生成新的so。但是问题仍然存在那里:
    • 如果说该生成的 so,还是要被拿来去生成另外一个可执行文件的话,在生成可执行文件的过程中还是会报错;
    • 如果说该 .so 最后仅仅是通过dlopen的方式来打开的话,那么那些undefined symbol在run time 时候会报错。,具体报错的时间也分两种情况
      • 如果是全局变量symbol undefined, 那么会dlopen失败,此时打印dlerror()的返回值会直接报错:xx symbol undefined.
      • 如果是全局的函数为定义,dlopen能够成功,等到函数真正的执行到了undefined symbol的时候,会报错:xx symbol undefined;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值