linux的库文件
静态库和动态库
在windows中静态库是以 .lib 为后缀的文件,共享库是以.dll 为后缀的文件。在linux中静态库是以 .a 为后缀的文件,共享库是以 .so为后缀的文件。
以linux下的静态库和动态库为例我们研究一下,首先我们看一下他们的生成方式
静态库:
首先将源文件编译成目标文件:gcc –c a.c b.c
生成静态库:ar –rc libstatic.a a.o b.o
共享库:
同静态库一样编译成目标文件:gcc –c a.c b.c
生成共享库:gcc –fPIC –shared –o libshared.so a.o b.o
由此可见静态库和动态库都是对目标文件的处理,也可以说库文件已经是机器码文件了,静态库和共享库的加载过程有很大的区别。
静态库的链接方法:
gcc –o staticcode –L. –lstatic main.c –static(默认库在当前文件夹)
共享库的链接方法:
gcc –o sharedcode -L. –lshared main.c(默认库在当前文件夹)
当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被copy到最终的可执行文件中。这就会导致最终生成的可执行代码量相对变多,相当于编译器将代码补充完整了,这样运行起来相对就快些。不过会有个缺点: 占用磁盘和内存空间. 静态库会被添加到和它连接的每个程序中,而且这些程序运行时, 都会被加载到内存中. 无形中又多消耗了更多的内存空间.
与共享库连接的可执行文件只包含它需要的函数的引用表,而不是所有的函数代码,只有在程序执行时,那些需要的函数代码才被拷贝到内存中。这样就使可执行文件比较小,节省磁盘空间,更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用,也同时节约了内存。不过由于运行时要去链接库会花费一定的时间,执行速度相对会慢一些,总的来说静态库是牺牲了空间效率,换取了时间效率,共享库是牺牲了时间效率换取了空间效率,没有好与坏的区别,只看具体需要了。
另外,.一个程序编好后,有时需要做一些修改和优化,如果我们要修改的刚好是库函数的话,在接口不变的前提下,使用共享库的程序只需要将共享库重新编译就可以了,而使用静态库的程序则需要将静态库重新编译好后,将程序再重新编译一便。
库操作的相关命令
nm
功能:
列出编入目标文件或二进制文件的所有符号。用途一:查看程序调用什么函数;用 途二:查看一个给定的库或目标文件是否提供了所需的函数。
语法:nm [options] file
常用选项:
-C 将符号名转换为用户级的名字。在让C++函数名可读方面特别有用。
-s 当用于.a文件时,输出把符号名映射到定义该符号的模块或成员名的索引。
-u 只显示未定义的符号,即在被检查的文件外部定义的文件。
-l 使用调试信息输出定义每个符号的行号,或未定义符号的重要位项。
ar
功能:将多个.o文件组合到一起成为.a文件。
语法:ar [options] lib*.a *.o
常用选项:
-c 如果存档文件不存在,则创建,并不显示ar发出的警告。
-q 把*.o添加到存档文件末尾而不检查是否进行替换。
-r 向存档文件中插入.o文件,替换已有的任何同名文件,新成员添加到文档末尾。
-s 创建或升级从符号到.a文件之间的交叉索引映射表,并加入到.a文件中。
等价与ranlib [*.a]。执行该命令后,可用nm –s来查看生成的索引。
ldd
功能:显示可执行程序运行所需的共享库。
语法
ldd [options] file
常用选项:
-d 执行重定位并报告所有丢失的函数。
-r 执行对函数和数据对象的重定位并报告丢失的任何函数或数据对象。
ldconfig
功能:
在默认搜寻目录(/lib和/usr/lib)及动态库配置文件/etc/ld.so.conf中所列的目录下,搜索出可共享的动态链接库(lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存了已排好序的动态链接库名字列表。该在系统启动时会运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。
语法:
ldconfig [options] path
例如:ldconfig /root/lib让系统共享/root/lib目录下的动态链接库,即在/etc/ld.so.cache中添加指定目录下的共享库。[注意]若该目录不在/lib,/usr/lib,/etc/ld.soconf所列的目录列表里,则再次运行ldconf时,此目录下的动态链接库就不被系统共享了。
常用选项:
-v 更新/etc/ld.so.cache的内容,列处每个库的版本号,扫描的目录和所有创建和更新的链接。
-p 仅显示/etc/ld.so.cache的内容,即ld.so所知道的共享库的当前列表。
-n ldconf仅扫描-n命令所指定的目录
-f CONF 指定动态链接库的配置文件为CONF,系统默认为/etc/ld.so.conf。
-c CACHE 指定生成的缓存文件为CACHE,系统默认为/etc/ld.so.cache。
当ldconf不带选项时,仅更新高速缓冲文件。
环境变量
$LD_PRELOAD 由空格分隔的共享库列表,在其它库之前加载,使它们有机会覆盖或重新定义标准库。
$LD_LIBRARY_PATH 由冒号分隔的目录清单,都是共享库搜索时会访问的目录
linux的库文件的更多相关文章
- linux下库文件的编程
编程到了一定的时候,总喜欢追求新的东西.将代码尽量模块化就是我的追求之一,原来只是满足于将代码从单文件中分离,通过头文件和实现文件实现模块化,后来发现最好的方法是打包成库文件,使用更加方便.尽管在li ...
- Linux安装库文件(环境变量和makefile)
CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项.这两个变量实际上涵盖了编译和汇编两个步骤. CFLAGS/CPPFLAGS: 指定头文件(.h文件)的路径, ...
- linux 静态库文件
1.生成目标文件 gcc -o mylib.o -c mylib.c 2.生成静态库文件 ar rcs libmylib.a mylib.o 查看库信息: nm libmylib.a //====== ...
- Linux下库文件的设置 (/usr/bin/ld: cannot find -lxxx 的解决办法)
在软件编译过程中,经常会碰到类似这样的编译错误: /usr/bin/ld: cannot find -lhdf5 这表示找不到库文件 libhdf5.so,若是其它库文件,则是 cannot find ...
- linux 动态库文件stripped属性理解
[file命令not stripped] UNIX下*.o和*.so文件显示的stripped和not stripped是什么意思? 表示符号表是否被清除. 在centos 6.2下用file命令查看 ...
- linux设置库文件加载包含路径
第一种方式vim /etc/ld.so.conf 将要包含的路径添加到此文件中退出重新登录使配置生效或者执行命令source /etc/ld.so.conf 另一种方式利用LIBRARY_PATH和L ...
- 深入探讨Linux静态库与动态库的详解(转)
2.生成动态库并使用 linux下编译时通过 -shared 参数可以生成动态库(.so)文件,如下 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静 ...
- linux web服务器必需的库文件
往往安装完linux之后,本文用的centos6.4,再编译安装其它服务器软件时,总是提示缺少各种库文件,在这里我总结了一下 平时web服务器经常需要的一些库,如下: yum -y install m ...
- 查看linux库文件32位还是64位
查看linux库文件32位还是64位 分类: linux2014-09-25 09:46 238人阅读 评论(0) 收藏 举报 objdump -a *.a objdump -a *.so
随机推荐
- 对比DOM和jQuery完善度
<input type="text" id="username" value="请输入你的用户名"> <script> ...
- sql语句练习50题
Student(Sid,Sname,Sage,Ssex) 学生表 Course(Cid,Cname,Tid) 课程表 SC(Sid,Cid,score) 成绩表 Teacher(Tid,Tname) ...
- hd2066一个人的旅行
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...
- struts2中的constant配置详解
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-/ ...
- 嵌入式系统coredump设计
阴沟翻船,马失前蹄,说明凡事皆有可能.自然,程序设计的再好,也会有crash的时候.开发期还还说,正式交付的系统crash自然更是难以承受的.无论何时,死一次就够了,得有方法查个水落石出. 几年前哥去 ...
- java后台开发传输乱码&&接口post传参失败
起因: 前几天遇到的问题,才有时间记录,需求:本地生成xml形式的字符串以参数形式用post方法传送到对方的固定接口: 这个需求写的时候感觉很容易,本地测试的时候,也觉得很简单就过了,然后和对方联调的 ...
- glRotate函数
void glRotate( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ) API说明:angle为旋转角度,单位为度:x,y,z是旋转轴的 ...
- 在CS代码页获取input输入框内肉----.net学习点滴
想在后台cs页面得到前台页面aspx中html控件input输入的值.通过访问input输入框的name属性值获取. 解决方法如下: 1.用Request["user"].toSt ...
- Magicodes.WeiChat——使用AntiXssAttribute阻止XSS(跨站脚本攻击)攻击
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插 ...
- elixir 入门笔记
安装 MAC 平台用 brew 安装 brew update brew install elixir 如果没有 erlang 环境,上面的命令会自定安装 erlang 的环境. 基本数据类型 iex& ...