Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543152
  • 博文数量: 104
  • 博客积分: 2089
  • 博客等级: 大尉
  • 技术积分: 1691
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-29 08:48
文章分类

全部博文(104)

文章存档

2015年(1)

2013年(13)

2012年(31)

2011年(59)

分类: C/C++

2012-11-30 10:03:37

使用一个库,库有动态和静态之分。
静态库只要能够编译通过,运行时就没有提示缺少这个库可能,因为把这个库就是这个使用者的一部分了。
动态库。两部分。
1 库信息的注册
主要是名字,其次有运行时到哪里找,找到后加载到什么位置。在编译部分完成,通常做法使用 -lxxx 参数参数传递给gcc。比如libxml2.so,
     gcc *.c -lxml2 -o a.out
那么
  1. # ldd a.out
  2. ....
  3. libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00007f6e935db000)
  4. ....
这个就是把libxml2.so.2的使用注册完成了。这是为运行时使用准备的。
2 声明库存放的位置
老生常谈的问题,寻找库的是ld.so,标准路径是/bin /bin64 /usr/bin /usr/bin64.
这些都记录在/etc/ld.so.cache. 这是ld.so直接找的地方。没有在这里注册的,放在标准路径,一般情况下也是不行的,照旧提示找不到。
/etc/ls.so.cache的来源。ldconfig 命令生成。
  1. ldconfig
ldconfig会遍历/etc/ld.so.conf文件,一行一个路径,一个路径一个路径的寻找,把动态库和它的绝对路径写在/etc/ld.so.cahce中,加速查找。
  1. # cat /etc/ld.so.conf
  2. /usr/X11R6/lib64/Xaw3d
  3. /usr/X11R6/lib64
  4. /usr/lib64/Xaw3d
  5. /usr/X11R6/lib/Xaw3d
  6. /usr/X11R6/lib
  7. /usr/lib/Xaw3d
  8. /usr/x86_64-suse-linux/lib
  9. ....
cache 是个没有换行符的文件,a.so 路径b.so 路径...,就这样排列,一般用这个命令查看

  1. # ldconfig -p
  2. ......
  3. libx86.so.1 (libc6,x86-64) => /usr/lib64/libx86.so.1
  4. libx86.so (libc6,x86-64) => /usr/lib64/libx86.so
  5. libxtables.so.4 (libc6,x86-64) => /usr/lib64/libxtables.so.4
  6. libxslt.so.1 (libc6,x86-64) => /usr/lib64/libxslt.so.1
  7. libxslt.so.1 (libc6) => /usr/lib/libxslt.so.1
  8. libxrxnest.so (libc6,x86-64) => /usr/lib64/libxrxnest.so
  9. libxrx.so (libc6,x86-64) => /usr/lib64/libxrx.so
  10. libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2
  11. libxml2.so.2 (libc6) => /usr/lib/libxml2.so.2
  12. .......
很清爽。
当然这都是root干的,变量LD_LIRARY_PATH给了平民自由,没有找到的会在这个变量下搜。
所以,声明库的位置应该在/etc/ld.so.cache 和 LD_LIBRARY_PATH中,这些地方没有,就等着报错吧。


阅读(1245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~