Chinaunix首页 | 论坛 | 博客
  • 博客访问: 114246
  • 博文数量: 14
  • 博客积分: 256
  • 博客等级: 入伍新兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-17 01:02
文章分类

全部博文(14)

文章存档

2017年(1)

2016年(4)

2015年(1)

2012年(6)

2010年(2)

分类:

2012-06-06 09:54:12

原文地址:静态库与动态库 作者:luozhiyong131

函数库分类:

静态库: 在编译过程中将库函数代码直接加入到生成的可执行程序中,程序运行过程中不需要利用库函数。

共享库: 编译时,只是在生成的可执行程序中简单指定需要使用的库函数信息,程序运行过程中需要利用库函数。

 

动态库: 共享库的一种变化形式,目前大都采用共享库的方式。

命名:

静态库: 前缀lib+库名+.a (libm.a, libstdc++.a)

共享库: 前缀lib+库名+.so+版本号 (libm.so.6, libc.so.6)

 

创建静态函数库

静态函数库是一组目标文件(*.o)的集合

创建步骤:

       gcc -c test1.c test2.c          (生成test1.o, test2.o)

       ar -cr libtest.a test1.o test2.o (生成函数库libtest.a)

ar函数说明:

用途:创建和修改库函数,或从库函数提取目标文件

举例:

ar -rs lib-name list-of-files    (将列表中的目标文件加入到库中,并产生索引文件)

ar -ds lib-name list-of-files    (将列表中列出的目标文件从库中删除,并产生索引文件)

ar -x lib-name list-of-files      (不修改库文件,从库中提取列表中列出的目标文件)

 

编译:gcc -o test test.c -L ./ -l test

 

一个容易忽略的顺序问题

静态库不能先于原程序链接,这是因为开始时还没有任何未定义的符号,库中的内容不会被链入,所以应该注意将静态库的使用(-l选项)都写在最后。

 

 

创建共享库步骤

创建共享库

        gcc -c -fPIC test1.c

              gcc -c -fPIC test2.c

              gcc -shared -fPIC -o libtest.so test1.o test2.o

 

编译使用了共享库的程序

              gcc -o main –Ldir -ltest main.c

 

共享库系统自动动态加载问题

1.拷贝动态库文件到/lib/usr/lib

   $ cp libalg.so /usr/lib   or  $cp libalg.so /lib

2.改变环境变量LD_LIBRARY_PATH

       $ LD_LIBRARY_PATH=$PWD

    $ export LD_LIBRARY_PATH

 

应用程序自身完成动态加载

   可以在自己的程序中使用 dlopen()。该函数将打开一个新库,并把它装入内存。       dlopen() dlfcn.h 中定义,并在 dl 库中实现。

 

检查库依赖关系

函数库之间的相互引用

ldd的使用:用于查看库函数之间的依赖性

[vick@nec gcc-lab]$ cd /usr/lib

[vick@nec lib]$ ldd libtiff.so

        libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x4004c000)

        libz.so.1 => /usr/lib/libz.so.1 (0x4006b000)

        libc.so.6 => /lib/i686/libc.so.6 (0x40079000)

        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

 

 

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