Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180121
  • 博文数量: 64
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 616
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-09 20:25
文章分类

全部博文(64)

文章存档

2016年(25)

2015年(39)

我的朋友

分类: LINUX

2015-08-27 17:47:54

什么叫静态链接库?

组织形式相对简单,里面的目标代码只能够进行静态链接,归根结底就是把原来的目标代码放在一起,链接程序根据每一份目标代码的符号表查找相应的符号。找到的话就把该函数里面需要定位的进行定位,然后将整块函数代码放进可执行文件里。但是静态链接库链接后产生的可执行文件包含了所有需要调用的函数的代码,占用空间大,如果有多个进行再内存中同时运行,内存中就存有多分相同的库函数代码,占多余空间。

编译生成目标文件---创建静态库----链接静态链接库,生成可执行文件

Gcc –o main mian.o libxxx.alibxxx.so)或gcc –o main maio –L. 0lxxx

Gcc file1.o file2.o –Lpath –lxxx –o program

编译器先到path目录下搜索libxxx.so文件,如果没有找到,继续搜索libxxx.a(静态库)

在程序运行期间,也需要告诉系统去哪找你的动态链接库文件,在UNIX下通过定义名LD_LIBRARY_PATH的环境变量来事先的,只需将path赋值给此变量即可,命令为:setenv LD_LIBRARY_PATH  your/full/path/to/dll,然后用ldd检查是否连接正常,ldd your program查看

什么叫动态链接库:

动态链接是在程序装载内存的时候才真正的把库函数代码链接进行确定他们的地址,并且就算有几个程序同时运行,内存也只存在一份函数拷贝。能够被夹在到不同进程的不同地址,所以代码要经过特别的变异处理(即位置无关代码)。这就牵扯到两个概念,静态绑定和动态绑定。

静态绑定的程序开始载入内存的时候,载入程序就会把程序所有调用到的动态代码的地址算出来,这种方式使刚运行的初始化时间较长,但完成动态装载后,程序的运行速度就很快。

动态绑定适当真正调用动态库代码时,载入程序才计算动态代码的逻辑地址,然后等待,一旦又需要使用的时候,载入程序采取计算这部分的代码,虽然初始化快,但运行比不上动态绑定。

编译成动态链接库-----链接动态链接库,生成可执行文件-----设置库文件的环境路径

使用动态链接库。

先检查一些语法和定义

Gcc file.o file2.o –Lpath –lxxx –o program

-shared 指定生成动态链接库,让连接器生成T类型的导出符号表,有时候也生成弱链接W类型的到处符号),不用该标志外部程序无法链接,相当于一个可执行文件

I-fPIC:表示链接为位置独立的代码,不用此项目的话,编译后的代码是位置相关的所以动态载入时通过代码拷贝的方式来满足不同进程的需要,而不能达到真正的代码段共享的目的。

L: 表示要链接的库在当前目录中

LD——LIBRARY_PATH:这个环境变量只是动态连接器可以装在动态库的路径

如果有root权限的话,就可以修改/etc/ld.so.conf文件,然后调用/sbin/idconfig来达到同样的目的,不过没有root权限,那就只能用LD_LIBRARY_PATH方法。

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