Linux .a .so 整理记录

2023-12-20 00:30:46

在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,如何取舍呢?

  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在run time 时候会报错。

文章来源:https://blog.csdn.net/baidu_35679960/article/details/135020818
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。