首页 > 其他 > 详细

静态库和动态库

时间:2021-09-02 07:27:23      阅读:10      评论:0      收藏:0      [点我收藏+]

静态库:
1. 编译时链接;
2.浪费空间和资源,如果多个程序链接了同一个库,则每个生成的可执行文件就都会有一个库的副本,必然浪费系统的空间;
3.若静态库修改了,需要重新进行编译所有链接的程序

动态库:
1. 运行时链接
2. 运行时被链接,程序运行速度稍慢
3.动态库在程序运行时被链接,所以磁盘上只需要保留一份副本,因此节约磁盘空间。如果发现bug或者升级也很简单,只需要用新的库把原来的替换掉。

GCC编译流程:
1.预处理:C/C++源文件中,#开头的命令都是预处理命令,包括头文件,宏定义以及条件编译等。预处理就是将头文件插入到源文件中,把宏定义展开,根据条件编译选择使用代码,最后这些代码输出到.i文件等待下一步处理。
gcc -E hello.c -o hello.i
2.编译:将C/C++代码编译成汇编代码
gcc -S hello.i -o hello.s
3.汇编:将编译等到的文件翻译成一定格式的机器代码
gcc -c hello.s -o hello.o
4.链接:将上步生成的OBJ文件和系统的OBJ文件,库文件链接起来,生成可执行文件。
gcc hello.o
静态链接是在GCC编译中链接时一起打包到可执行文件;而动态库在程序编译时并不会链接导目标代码中,而是在程序运行时才载入。不同的应用程序如果调用相同的库,那么在内存中只需要有一份该共享库的实例,规避了浪费空间的问题。动态库是在程序运行时才载入,也解决了静态库对程序的更新,部署和发布带来的麻烦。用户只需要更新动态库即可。

生成静态库:
ar crv libfoo.a foo.c other.c
加载静态库:
g++ -o main main.cpp -L. -lfoo -static

生成动态库:
g++ -o libshare.so -fPIC -shared share1.cpp share2.cpp  
加载动态库:
g++ -o main mian.cpp -L. -lshare
通过g++来指定路径:
g++ -o main main.cpp -Wl,-rpath=./ -L. -lshare
-Wl,-rpath是用来指定动态库的路径

此外,动态库指定路径有以下几种方法:
1. export更改LD_LIBRARY_PATH当前终端的环境变量
2.cp libfoo.so /usr/lib //将库拷贝到系统库路径下(不推荐)
修改/etc/ld.so.conf文件,加入库文件所在目录的路径,然后 运行ldconfig 目录名字,该命令会重建/etc/ld.so.cache文件即可
4.gcc指定路径

静态库和动态库

原文:https://www.cnblogs.com/BaymaxHH/p/15209698.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!