gcc动态链接库路径

动态链接库路径

众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中。linux除了默认的搜索路径之外,还通过以下三种方法指定:

  1. 配置文件/etc/ld.so.conf (编辑之后,需要运行命令ldconf来使得更改生效)
  2. 通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
  3. 编译目标代码时,指定动态搜索路径-Wl,-rpath

以上,我们一共有5个路径指定方式,它们的先后顺序是:编译时指定 > 环境变量 > 配置文件 > 默认路径

tips

Q:共享库如何命名?
在linux系统中,共享库的命名方式是libNAME.so.

常见问题

Q:librte_eal.a(eal.o): undefined reference to symbol ‘pthread_create@@GLIBC_2.2.5’ /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line)

这个问题比较特殊,ld找不到对应symbol不是由于对应so不在路径中,而是DSO missing from command line.
解决方法:链接阶段,指定使用的动态库:-lpthread -lrt

Q:为何需要显式指定某个动态链接库?
解答:从ubuntu11.04之后,ld的机制发生了变化。对于这样的场景:

function spin: included in libwheel;
libcar used libwheel;
program pro used libcar;

在原来,pro是直接可以引用spin函数——即使它并没有use libwheel;但是这里有一个潜在的风险:一旦libcar不再use libwheel,这个依赖的传递性就会被打破,如此将产生链接错误。所以,ld now runs with the --no-copy-dt-needed-entries option enabled by default.。必须显式指定动态链接的函数所在的库。

猜你喜欢

转载自blog.csdn.net/weixin_42994525/article/details/83244188