静态链接和动态链接

静态链接

将一组可重定位目标文件链接到可执行文件里

g++ -c test.cc
ar rcs libtest.a test.o
# ar命令把目标文件集合压缩在一起

静态库里一般一个目标文件只包含一个函数,链接器在链接静态库时以目标文件为单位,如果很多函数都放在同一个目标文件中,会导致很多未使用的函数都被一起链接到可执行文件里

动态链接

把链接过程推迟到运行时进行

程序被装载时,动态链接器会把程序所需要的所有动态链接库装载到进程的地址空间,并将程序中所有未决议的符号绑定到相应的动态链接库中,并进行重定位工作

g++ -fPIC -shared -o libtest.so test.cc
# -fPIC是编译选项,表示要生成位置无关的代码,这是动态库需要的特性
# -shared是链接选项,告诉g++生成动态库而不是可执行文件

总结

优先级

如果同一路径下存在同名的动态库和静态库,例如libtest.so和libtest.a都在同一路径下,则gcc会优先链接动态库

# 链接当前目录下的libtest.so
g++ -o main main.cc -L./ -ltest
# 链接当前目录下的libtest.a
g++ -o main main.cc -static -L./ -ltest 

依赖问题和路径问题

链接多个静态库时要考虑依赖问题,链接动态库时要考虑路径问题

动态库链接成功后,执行可执行文件时,出现error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory

Linux通过/etc/ld.so.cache文件搜寻要链接的动态库,而/etc/ld.so.cacheldconfig命令读取/etc/ld.so.conf文件生成的,如果使用的动态库不在该文件配置的路径下,就会导致程序执行时无法找到需要的动态链接库

两种解决方法

  • 把动态库的路径添加到环境变量LD_LIBRARY_PATH ,这样程序会从环境变量LD_LIBRARY_PATH指定的路径中查找动态库

  • 把动态库所在的路径添加到/etc/ld.so.conf文件中,再运行 ldconfig命令更新/etc/ld.so.cache

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容