程序运行时,是怎么找到动态库的?

我们随便开发一个C/C++程序,都很大程度不可避免的需要用到动态库:
<stdio.h>int main(){ printf(“hello,编程珠玑\n”); return 0;}编译并查看使用到的动态库:$ gcc -o main main.c$ ldd main linux-vdso.so.1 (0x00007ffdf8fdf000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1f8535e000) /lib64/ld-linux-x86-64.so.2 (0x00007f1f85951000)从ldd命令的结果我们可以看到main程序依赖了哪些动态库,并且在哪个路径。那么你有没有想过,动态库的路径是怎么找到的,查找顺序又是怎样的呢?准备动态库在此之前如果你还没有对动态库有一个基本的了解的话,建议你阅读《浅谈静态库和动态库》或其他相关资料。为了说明后面的问题,这里我们先创建一个简单的动态库,你也可以参考《手把手教你制作动态库》:// test.c//来源:公众号【编程珠玑】#include <stdio.h>#include “test.h”#include "test1.h"void test(){ printf(“I am test;hello,编程珠玑\n”); test1();}// test.hvoid test();//test1.c#include <stdio.h>#include "test1.h"void test1(){ printf(“test1,needed by test\n”);}// test1.hvoid test1();分别制作动态库libtest.so和libtest1.so,这在后面的示例中会用到:$ gcc test1.c -fPIC -shared -o libtest1.so$ gcc test.c -fPIC -shared -o libtest.so -L. -ltest1这样你在当前目录下就会看到有一个libtest.so和libtest1.so文件生成了,其中litest.so依赖libtest.so注意,由于libtest.so依赖libtest1.so,这里用-L指定了要链接的test1的路径,因此我们看到:$ ldd libtest.so linux-vdso.so.1 (0x00007ffd1bbca000) libtest1.so => not found libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9f1d0ae000) /lib64/ld-linux-x86-64.so.2 (0x00007f9f1d6a1000)从这里可以看出libtest是依赖libtest1库的,但是特别注意到,libtest1.so指向的是not found,这会有什么影响吗?我们后面就会看到。链接时查找路径我们都知道,在编译成可执行文件前,链接器链接动态库也是需要查找动态库路径的,否则怎么链接上指定的动态库呢?那么这个顺序又是怎样的呢?首先会查找的会是编译时链接的路径。修改前面的main.c,让它调用libtest.so中的test函数:// 来源:公众号【编程珠玑】#include <stdio.h>#include "test.h"int main(){ test(); // 调用libtest.so中的test函数 return 0;}编译链接:$ gcc -o main main.c -I ./ -L./ -ltest -ltest1完美编译过。除此之外,如果我们把libtest.so和libtest1.so都移到/usr/lib下面,我们发现,即便不用-L也能编译过了:$ gcc -o main main.c -I ./ -ltest -

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值