浅谈linux静态库、动态库。
动态库又叫动态共享文件(.so,Dynamic Shared Objects)和静态库(.a)都是将一些待重用的公共代码打包成一种特殊的重定位目标文件。
在使用时,连接器会将静态库中所有的代码,编译到可执行文件中。动态库有链接时动态库和运行时库之分。链接时,连接器会查找出使用的库中函数以及变量,在可执行文件中定向位置。可执行文件运行时,还需要根据文件中信息,在环境变量中去查找对应的库和对应的符号。
1、静态库和动态库度的区别?
静态库在使用的时侯会将所有代码直接拷贝到可执行文件中,在运行时可执行文件和静态库没有关联。但最后生成的执行文件较大,并且如果有多个执行文件使用了同一个静态库,在运行时内存中会有多份相同的代码。而且在链接时有较多度的处理,导致链接时的速度较慢。
动态库没有将代码编译进执行文件,只是在编译时向执行文件中添加了用到的符号的信息。生成的执行文件相对较小,在运行时,执行该文件首先会在内存中查找或者在文件系统加载用到的动态库。动态库的使用一般都是共享的,多个进程使用同一个动态库中的代码。使用动态库的优点是生成的执行文件较小,占用内存也较小,编译速度相对来说较快。缺点是部署时必须确认环境。
动态库还有一种dlopen(3)打开库的使用方式,通常成为显示调用,而链接方式通常称为隐式调用。首先通过dlopen(filename,flags) 打开动态库,返回动态库标识符,然后使用dlsym(3)[void *dlsym(void *handle, const char *symbol);]获得函数指针。关闭动态库调用使用dlclose();输出错误并清除errno使用dlerror();
2、linux下有哪些调试库信息的命令。
静态库本身被编译进执行文件,文件中包含所有运行时需要度符号和实现,不会报symbol缺失。
查看库文件本身信息可以用readelf。
查看当前执行文件依赖的动态库信息可以使用readelf -d。
查看执行文件的symbol信息使用nm命令。
查看执行文件依赖的共享文件的名称和位置使用ldd命令。
3、编译静态库和动态库的选项。
linux编译静态库命令为ar
gcc/g++编译动态库命令为-shared
4、一些问题。
a:如果动态库使用c++实现,那么使用dlopen打开动态库后,有可能无法根据函数名称获得其在内存中的偏移量。这是因为c++符号信息与c有很多不同,编译时g++会给符号添加许多信息来区别标识符重载、不同命名空间等,dlsym获取不到正确信息是正常的。解决办法是使用[extern "C"]方式将c++符号导出为c符号。
b:动态库编译时使用-fPIC的原因 见https://www.cnblogs.com/cswuyg/p/3830703.html
未完待续......
浅谈linux静态库、动态库。的更多相关文章
- linux静态与动态库创建及使用实例
一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
- Linux系统中“动态库”和“静态库”那点事儿【转】
转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...
- Linux系统中“动态库”和“静态库”那点事儿
摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...
- Linux 静态库&动态库调用
1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...
- Linux中创建和使用静态库&动态库
库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
- 【转】分析Linux和windows动态库
原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...
随机推荐
- 【Django】模型层说明
[Django模型层] 之前大概介绍Django的文章居然写了两篇..这篇是重点关注了Django的模型层来进行学习. ■ 模型定义 众所周知,Django中的模型定义就是定义一个类,其基本结构是这样 ...
- 怎样把Linux的私钥文件id_rsa转换成putty的ppk格式
在Linux VPS下产生的私钥文件putty是不认识的,putty只认识自己的ppk格式,要在这两种格式之间转换,需要PuTTYgen这个程序. puttygen是putty的配套程序,putty的 ...
- Hibernate学习(2)- hibernate.cfg.xml详解
1:主配置文件主要分为三部分: 注意:通常情况下,一个session-factory节点代表一个数据库: 1.1:第一部分 数据库连接部分,注意"hibernate.connection.d ...
- 数据库(Mongodb)
1.MongoClient()函数 In [8]: import pymongo In [9]: con = pymongo.MongoClient('localhost') #建立连接 In [10 ...
- java设计模式-State(状态)模式
state定义 不同的状态,不同的行为;或者说,每个状态有着相应的行为. 就像电风扇的开关,一档的上一个是关闭,关闭的上一个是五档,五档的上一个是四档,以此类推,而且五档的下一 ...
- iOS企业版使用第三方实现自动更新版本
1.获取本地版本和互联网版本 NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; N ...
- 微信公众号报错 config:invalid signature
官方已经提供了微信 JS 接口签名校验工具(http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign),填入相应的参数就能出来相应的signa ...
- C#基础(二)拆箱与装箱,循环与选择结构,枚举
一.装箱和拆箱 装箱是将值类型转换为引用类型 eg: Int a=5; Object o=a; 拆箱是将引用类型转换为值类型 eg: Int a=5; Object o=a; Int b=(int ...
- 数据结构基础——结构体struct及类型别名typedef的使用
一.结构体的创建 在C语言中,实现数据结构的一种常用方法便是使用结构体(structure)其示例代码如下: struct stu { int num; char ch; }; struct表示创建结 ...
- python 堆排序
堆排序就是把堆顶的最大数取出, 将剩余的堆继续调整为最大堆,具体过程在第二块有介绍,以递归实现 剩余部分调整为最大堆后,再次将堆顶的最大数取出,再将剩余部分调整为最大堆,这个过程持续到剩余数只有一个时 ...