Linux .a .so 整理记录
发布时间:2023年12月19日
在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。但是问题仍然存在那里:
2.1 如果说该生成的 so,还是要被拿来去生成另外一个可执行文件的话,在生成可执行文件的过程中还是会报错;
2.2 如果说该 .so 最后仅仅是通过dlopen的方式来打开的话,那么那些undefined symbol在run time 时候会报错。
文章来源:https://blog.csdn.net/baidu_35679960/article/details/135020818
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!