Chinaunix首页 | 论坛 | 博客
  • 博客访问: 483881
  • 博文数量: 71
  • 博客积分: 1332
  • 博客等级: 少尉
  • 技术积分: 772
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 16:25
个人简介

文章分类

全部博文(71)

文章存档

2013年(19)

2012年(9)

2011年(43)

分类: C/C++

2011-04-25 23:28:25

在学习ldd命令的过程中,查到了关于动态库和静态库的知识,特此整理和分享一下,这里记录的只是知识点,看起来会不怎么有条理。


  1. 库,是一种封装机制,简单说把所有的源代码编译成目标代码后打成的包。(引用)

1、 linux C 编程的时候,gcc会默认在/usr/include目录下寻找头文文件,这个目录是标准库文件所在目录,非标准的库一般情况下是不直接放在这里的。


2、gcc进行编译的时候有三个选项,这里记录一下,当时在看参考资料的时候,只是因为这几个选项没明白,对后面的理解就没有很好。

 -l 选项 (小写L)

参数显式链接需要链接的库

  -Idir 选项

         把目录添加到寻找头文件的目录列表中,由-I选项指定的目录会在标准库文件目录之前被寻找,如果指定的目录是标准库文件目录,该目录会被忽略。

     -Ldir 选项

 和 -I 选项一样功能。


3、静态库

缺点是占用空间,如果被多处用的,修改的时候会很痛苦。但是程序的可移植性比较好。


4、动态库

动态库的出现避免了静态库的缺点。


5、静态库是在链接阶段被链接的,动态库是在程序执行的时候被链接的。即使程序编译完成之后,库仍然需要保留在系统上,以备程序运行时的调用。由于种种原因,链接时是优先链接动态库的,如果不成功,则链接静态库。除非用-static参数指定链接静态库。(这里的话大部分是引用的,我不是搞开发的,知道个大概就可以了,呵呵)。


6、3种方法是自己的非标准库被gcc找到

6.1、把自己的库放到/lib,/usr/lib下

6.2、编辑/etc/ld.so.conf文件,把当前路径加入,然后运行ldconfig,或者以当前路径为参数运行ldconfig(root权限)。

6.3、把当前路径加入环境变量LD_LIBRARY_PATH


  1. export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

7、创建静态库


7.1、多步操作


  1. # gcc -c hello.c
  2. # ar r libhello.a hello.o
  3. ar: creating libhello.a
  4. # file libhello.a
  5. libhello.a: current ar archive

7.2、命令操作


  1. # gcc test.c -lhello -L. -static -o hello.static


8、创建动态库


  1. # gcc test.c -lhello -L. -o hello.dynamic

只要把上个命令中的-static参数去掉就可以了。


9、如何判断一个程序有没有链接动态库?

9.1file

9.2、ldd

ldd是用来打印目标程序(由命令行参数指定)所链接的所有动态库的信息的,如果目标程序没有链接动态库,则打印“not a dynamic executable”

9.3、file和ldd结果(引用)


  1. # file hello.static hello.dynamic
  2. hello.static: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.6,
  3. statically linked, not stripped
  4. hello.dynamic: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.6,
  5. dynamically linked (uses shared libs), not stripped


  1. # ldd hello.static hello.dynamic
  2. hello.static:
  3. not a dynamic executable
  4. hello.dynamic:
  5. linux-gate.so.1 => (0xffffe000)
  6. libhello.so => ./libhello.so (0x4001f000)
  7. libc.so.6 => /lib/libc.so.6 (0x40034000)
  8. /lib/ld-linux.so.2 (0x40000000)

10、参考资料


http://blogold.chinaunix.net/u1/52743/showart_2025225.html





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