动态库又叫动态共享文件(.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. phpcms v9 搜索结果列表页时间显示1970问题解决方案

    对于喜欢用phpcms v9 的小伙伴来说,在调用时间时,总会出现时间1970这样的问题,对于这个问题,网上的说法很多,内容页时间显示通常不会问题,搜索结果页就不行了,通过总结,发现使用{format ...

  2. 移动端H5地图矢量SHP网格切分打包方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 与离线瓦片方案一样,同样是为了解决移动端网速和流量问题,但是却 ...

  3. 简单谈谈DNS的工作原理及实践

    DNS协议简介 dns(Domain Name System)是一个全球化的分布式数据库系统,用于存储域名和互联网IP地址的映射关系.dns协议是计算机协议栈应用层中,应用最广泛的协议之一.用户每一次 ...

  4. JavaScript(第二十四天)【事件对象】

    JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功能.最方便和强大的就是事件对象,他们可以帮你处理鼠标事件和键盘敲击方面的情况,此外还可以修改一般事件的 ...

  5. 敏捷冲刺每日报告——Day3

    1.情况简述 Alpha阶段第一次Scrum Meeting 敏捷开发起止时间 2017.10.27 00:00 -- 2017.10.28 00:00 讨论时间地点 2017.10.27晚9:30, ...

  6. 20162330 第10周 MySort实验

    关于MySort的进一步实践 课堂作业题目如下: 模拟实现Linux下Sort -t : -k 2的功能.参考Sort的实现.提交码云链接和代码运行截图. import java.util.*; pu ...

  7. backpropagation

    github: https://github.com/mattm/simple-neural-network blog: https://mattmazur.com/2015/03/17/a-step ...

  8. 《Language Implementation Patterns》之 强类型规则

    语句的语义取决于其语法结构和相关符号:前者说明了了要"做什么",后者说明了操作"什么对象".所以即使语法结构正确的,如果被操作的对象不合法,语句也是不合法的.语 ...

  9. Django 模版语法

    一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. {% extends "base ...

  10. 10-TypeScript中的接口

    接口是一种规约的约定,从接口继承的类必须实现接口的约定.在高级开发中,通常接口是用于实现各种设计模式的基础,没有接口,设计模式无从谈起. 定义接口: interface ILog{ recordlog ...