动态库、静态库和链接
作者:互联网
目录
静态库
静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。
生成静态库命令:gcc -shared -o func.a func.o //或 ar cr func.a func.o动态库
动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。
编译:需要指定-l选项,链接相应的库;如果要在运行时搜索自己的库文件路径,要用-Wl,rpath选项来指定。
生成动态库命令:gcc -shared -fPIC libfunc.so func.o
例如:有libfunc.so
gcc -o test -L./ -lfunc -Wl,rpath=./
运行时,要将libfunc.so放到test同路径下。(因为-Wl,rpath指定了当前路径)a.编译目标代码时指定的动态库搜索路径;(-L选项指定)
b.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
c.配置文件/etc/ld.so.conf中指定的动态库搜索路径;(修改完文件后,用ldconfig更新)
d.默认的动态库搜索路径/lib和/usr/lib;库相关的命令
ld 是gcc的链接程序。
ldd 是查看可执行文件中所依赖的库的程序,比如想查main程序用到了那些动态库,可以直接ldd main
ldconfig 用来更新文件/etc/ld.so.conf的修改生效。
nm 用来查看.so库中的函数名字,标记是T的就是动态库里面生成的名字。如:nm /lib/libc*.so静态库和动态库区别
使用
静态库只在编译时指定库即可,动态库在编译和运行时都需要库。
动静态库优缺点
静态库优点:
1.运行时不需要库文件
2.直接存在于最终文件,运行速度稍微快一点。
动态库:可执行文件只包含需要的库的函数的引用表,只有在程序执行时,需要的函数代码才会拷贝到内存中。
运行时要去链接库会花费一定的时间,执行速度相对会慢一些。
3.牺牲空间换时间动态库优点:
1.目标程序小
2.运行时才载入的特性,让我们可以随时对库进行替换,而不需要重新编译代码
3.操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用,也同时节约了内存
4.牺牲时间换空间
标签:静态,目标程序,编译,so,func,动态,链接 来源: https://blog.csdn.net/feiying0canglang/article/details/99843545