动态库又叫动态共享文件(.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静态库、动态库。的更多相关文章

  1. linux静态与动态库创建及使用实例

    一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...

  2. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

  3. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

  4. Linux系统中“动态库”和“静态库”那点事儿【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...

  5. Linux系统中“动态库”和“静态库”那点事儿

    摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...

  6. Linux 静态库&动态库调用

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  7. Linux中创建和使用静态库&动态库

    库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...

  8. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  9. 【转】分析Linux和windows动态库

    原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...

随机推荐

  1. 【Saltstack】Saltstack简单说明

    [Saltstack] Saltstack是一个服务器集中管理中心平台,可以帮助管理员轻松的对若干台服务器进行统一操作.类似的工具还有Ansible,Puppet,func等等.相比于这些工具,sal ...

  2. C++引用指针 & 构造函数

    近来回转 C++的学习,脑子又被搞得了一团迷(简直不要忘得太快.....    ) 过后静下来想一想,还是因为有些东西没搞清楚导致,所以理了理两个容易搞迷糊的地方. 1. 引用与指针 C++进行传值更 ...

  3. 设计模式 --> (6)原型模式

    原型(Prototype)模式 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知 ...

  4. Algorithm --> 求阶乘末尾0的个数

    求阶乘末尾0的个数 (1)给定一个整数N,那么N的阶乘N!末尾有多少个0?比如:N=10,N!=3628800,N!的末尾有2个0. (2)求N!的二进制表示中最低位为1的位置. 第一题 考虑哪些数相 ...

  5. java排序算法(十):桶式排序

    java排序算法(十):桶式排序 桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征: 待排序列所有的值处于一个可枚举的范围之类: 待排序 ...

  6. linux设置代理修改接口数据

    其实很简单,希望看到的人可以一次搞定,所以我把所有步骤写一块儿了. 1.首先在自己能上网的机器上安装fiddler,程序自己百度搜就可以,百度软件中心的程序就行. 2.安装fiddler后,管理员权限 ...

  7. java.util.zip

    使用java自带的类 java.util.zip进行文件/目录的压缩的话,有一点不足,不支持中文的名件/目录命名,如果有中文名,那么打包就会失败.本人经过一段时间的摸索和实践,发现在一般的Ant.ja ...

  8. 开篇/javascript基础知识点

    html css js 分别是一个网站的:内容  样式 行为: js 的三种样式:行内 内嵌 外链. 函数的特性:1.可以重复执行的代码块.2.不调用不执行.3.要访问里面,必须先执行. 内置对象:j ...

  9. 关于C语言的第0次作业

    1.你认为大学的学习生活.同学关系.师生关系应该是怎样的?请一个个展开描述. 我认为的大学学习生活是充实的,丰富多彩的,与高中快节奏.繁忙的生活有所不同.在上了大学我们都成熟了很多,懂得了包容与忍让, ...

  10. 关于DLL的创建与使用简单描述(C++、C#)

    前言 前一段时间在学关于DLL的创建与调用,结果发现网络上一大堆别人分享的经验都有点问题.现在整理分享一下自己的方法. 工具 Microsoft Visual Studio 2017 depends ...