运行时,是怎么找到动态库的?
|
样你在当前目录下就会看到有一个libtest.so和libtest1.so文件生成了,其中litest.so依赖libtest.so 注意,由于libtest.so依赖libtest1.so,这里用-L指定了要链接的test1的路径,因此我们看到:里可以看出libtest是依赖libtest1库的,但是特别注意到,libtest1.so指向的是not found,这会有什么影响吗?我们后面就会看到。 链接时查找路径 我们都知道,在编译成可执行文件前,链接器链接动态库也是需要查找动态库路径的,否则怎么链接上指定的动态库呢?那么这个顺序又是怎样的呢? 首先会查找的会是编译时链接的路径。修改前面的main.c,让它调用libtest.so中的test函数:里需要说明的是,我们通过-L./来指定搜索库的路径,由于libtest.so依赖libtest1.so,因此在编译链接时,也需要链接上test1。 小结 从上面的内容可以看到,在链接时,我们通过-L参数搜索要链接的库路径,但是这个路径信息不会写到ELF文件中,因此你会通过ldd命令看到not found,而通过-rpath可以指定链接时的搜索路径,这个信息会写入到ELF文件中,最终看到的结果是,由于libtest.so依赖libtest1.so,所以其他程序依赖libtest.so时,会自动从写入ELF的rpath中搜索它依赖的其他库,因此只需要链接libtest即可,例如: 在制作库libtest1.so时,加上-rpath-link选项:需要链接libtest.so,其依赖的libtest1.so也链接进来了。 当然了,如果-L指定的路径没有呢,它还会去查找其他地方,否则依赖的系统库怎么找到呢?总结大致顺序如下:
针对具体的系统或链接器,可能有些差异,但是大致如此。 运行时查找路径
虽然前面编译成功了,但是我们运行看看,发现运行失败了。 (编辑:四平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

