Linux .a .so 整理记录

在Linux系统下,

  • .a 是静态库,是直接把一坨 .o打包起来的一个库,反向也是可以的,有工具可以把.a重新分开成单独的.o;
  • .so 是动态库,动态库的好处也是个老生常态的话题了,比如对库的使用着来讲更友好, 如果仅仅是库更新的话,不需要库的使用者重新编译自己的程序;再比如如果该库会被很多程序使用的话,使用 .so可以节省内存,因为只需要把该 .so load一份到内存中,所有的程序共享该 so即可,当然该 so 对应的数据段还是每个程序独有的,只是把代码段共享了。

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

  1. 如果link .a的话,简单来讲,去link .a, 和直接在程序的link命令里 增加一个个的 .o 没什么区别,并且,还有个好处,链接器只会使用那些被用到的 .o, 没被用到的就丢弃了。
  2. 如果link .so的话,就复杂一写,如果你要link该.so来生成一个可执行文件的话,那么在最后的link阶段,该so里面所有的符号必须要有定义,否则的话,会报undefined symbol error,这和 .a是不同的。当然如果你仅仅是需要link so,来生成另外一个 .so, 那在link阶段没问题,能成功生成新的so。但是问题仍然存在那里:
    2.1 如果说该生成的 so,还是要被拿来去生成另外一个可执行文件的话,在生成可执行文件的过程中还是会报错;
    2.2 如果说该 .so 最后仅仅是被通过dlopen的方式来打开的话,那那些undefined symbol只要是没被使用到,其实就没问题。

相关推荐

  1. Linux .a .so 整理记录

    2023-12-15 18:14:03       60 阅读
  2. 【前端学习记录】Vue前端规范整理

    2023-12-15 18:14:03       64 阅读
  3. 力扣刷题记录&整理——(十七)Math&Geometry

    2023-12-15 18:14:03       37 阅读
  4. 力扣刷题记录&整理——(十八)Bit Manipulation

    2023-12-15 18:14:03       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-15 18:14:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-15 18:14:03       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-15 18:14:03       87 阅读
  4. Python语言-面向对象

    2023-12-15 18:14:03       96 阅读

热门阅读

  1. 全栈开发组合

    2023-12-15 18:14:03       66 阅读
  2. PHP的延迟静态绑定

    2023-12-15 18:14:03       67 阅读
  3. git 常用的使用方法

    2023-12-15 18:14:03       56 阅读
  4. shell初识

    2023-12-15 18:14:03       52 阅读
  5. Redis的过期策略有哪些?

    2023-12-15 18:14:03       60 阅读
  6. linux查看防火墙状态及开启关闭命令

    2023-12-15 18:14:03       59 阅读
  7. 服务器迁移到另一台服务器需要注意哪些?

    2023-12-15 18:14:03       62 阅读
  8. Web Day2

    Web Day2

    2023-12-15 18:14:03      46 阅读
  9. Harmony OS基本介绍

    2023-12-15 18:14:03       54 阅读
  10. facebook的营销方式

    2023-12-15 18:14:03       53 阅读
  11. Python实现自动登录Facebook机器人

    2023-12-15 18:14:03       50 阅读