Linux 静态库和动态库 使用说明

    Linux下程序运行中,有两种库,静态库和动态库。

    静态库:名字一般为libxxx.a,编译时会整合到可执行程序中,优点是运行时不需要外部函数库支持,缺点是编译后程序较大,一旦静态库改变,程序需要重新编译。

    动态库:名字一般为libxxx.M.N.so,M为主版本号,N为副版本号。优点是运行时,有需要时才动态调用外部库中的函数,节省空间,缺点是运行环境中必须提供相应的库,动态库更新升级方便。

  静态库的制作和使用

    

动态库的制作和使用

动态库的后缀为.so,一般存放在/lib, /usr/lib等目录下,可以使用ldd工具来查看一个可执行程序使用了哪些动态库,见下图:

可以看到,我们常用的ls命令使用的动态库位于/lib/i386-linux-gnu/目录下。

动态链接是由操作系统运行程序时调用的,既然是程序,那按照Linux的风格,肯定有对于的配置文件来设置,动态链接库的配置文件位于/etc/ld.so.conf,具体内容如下:

从上图可以知道,系统搜索动态链接库的路径位于特定的目录。Linux系统为了提高动态链接库的运行性能,把一些常用的动态链接库放在/etc/ld.so.cache这个文件中去。如何更新这个动态链接库的缓存文件呢?Linux提供了ldconfig命令来更新,这个命令主要搜索/lib和/usr/lib以及配置文件ld.so.conf.d/目录下的可用的动态链接库文件,然后重新创建新的动态链接程序/lib/ld-linux.so.2所需的连接和更新动态链接库缓存文件ld.so.cache.

   ldconfig –p | head or grep XX : 查看系统中有哪些动态链接库

   ldconfig –v 输出动态链接库扫描目录并且刷新ld.so.cache缓存

   执行ldconfig需要root权限。

   既然是动态链接库,那就是需要开发出来给其他人使用的。按照C语言的风格,h头文件提供函数库的接口说明,就像stdio.h头文件一样,我们用到的输入输出,都必须包含这个头文件。要使用我们自己的动态链接库,那就要包含动态链接库提供的头文件。

然后是编译生成动态链接库

  

使用动态链接库

 

如果是在团队开发过程中,建议将动态链接库放在/lib或则/usr/lib,或者自定义的/usr/local/lib/目录下,然后将库路径添加到自己库的配置文件mytest.conf,将此配置文件拷贝到/etc/ld.so.conf.d/目录下,执行ldconfig就可以。

  动态链接库的动态加载方式

    Linux提供了一套API用于动态加载动态链接库,更加灵活的使用动态链接库,详细代码和注释如下:

 

编译后执行:

注意事项:

        在使用动态执行动态链接库时,可执行程序需要添加 dlfcn.h头文件

        在编译时,需要增加 –rdynamic –ldl 这两个参数,产生可以调用动态链接库的执行代码。

Technorati 标签: 动态库 静态库

 

参考链接:

http://blog.chinaunix.net/uid-23069658-id-3142046.html

时间: 2024-10-23 11:32:11

Linux 静态库和动态库 使用说明的相关文章

linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考<Linux程序设计> 1. 静态库也被称为归档文件(archive,因此创建命令是ar),编译器和链接器负责将程序代码和静态库结合在一起组成单独的可执行文件: 但是缺点是许多应用程序同时运行并使用来自同一个静态库的函数时,内存中就会有一个函数的多份副本,而且程序文件自身也有多份同样的副本,这将消

Linux使用静态库和动态库

Linux使用静态库和动态库 (一)库的概念 库是可以复用的代码,在一些大的项目中常常会用到库. 本质上说:库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 一般说库是说两种: 静态库:linux下.a文件.windows下.lib文件 动态库:linux下.so文件.windows下.dll文件 最近花了一些时间把linux下编译.链接等研究了一下,作为一个菜鸟记录并分享一蛤. (二)静态库与动态库 程序的编译运行要经过以下步骤: 1.源文件(.h .cpp等) 2.预编译 3.编

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

linux学习 建立静态库,动态库,写简单的makefile

建立静态库 建立四个文件 bin(可执行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件中执行 1)gcc -c add.c //编译add.c源文件生成add.o目标文件 2)ar crsv ../lib/ libadd.a add.o //对目标文件*.o进行归档,生成lib*.a, 把这个生成文件放在lib里 3)gcc -o main main.c -L(大些的爱偶,放库的路径)../lib   –l(小写的爱偶,库名为add) a

【转】Linux下gcc生成和使用静态库和动态库详解

一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者的库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2 库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可

Linux 如何生成静态库和动态库

1.引言 1.linux下的库 静态库和共享库(动态库),二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小. 2.库存在的意义 库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议. 现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 共享库的好处是,不同的应用程序如果调用相同的库,那么

Linux学习笔记7——linux中的静态库和动态库

一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用ar -r可以将文件归档成静态库,调用格式:ar -r 静态库文件 被归档的文件 例如:我们这有两个C文件,分别为test1.c和test2.c 首先我们将它编译成目标文件:gcc -c -static test1.c gcc -c -static test2.c 此时会产生两个文件,分别为test1

g++编译使用生成静态库和动态库(Linux)

参考文献: Linux下g++编译与使用静态库和动态库 用g++编译生成动态链接库*.so的方法及连接(多个.cc生成一个*.so) 占坑

(笔记)Linux下的静态库和动态库使用详解

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.当 然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译. 2. 动态函数库 这类库的名字一般是libxxx.so;相对于