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

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

  1. Linux下Gcc生成和使用静态库和动态库详解(转)

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

  2. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

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

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  4. [转]Linux下用gcc/g++生成静态库和动态库(Z)

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

  5. 在Linux中创建静态库和动态库

    我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...

  6. 详细讲解 关于Linux静态库和动态库的分析

    基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: ...

  7. linux下的共享库(动态库)和静态库

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

  8. linux中C的静态库和动态库分析

    从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...

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

    一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用a ...

随机推荐

  1. 关于Android中TextView显示多个空格

    一.直接填写文字,输入多少,显示多少,如下: android:text="AAA     AAA"     ————————>显示:AAA     AAA 二.通过设置str ...

  2. LeetCode35 Search Insert Position

    题目: Given a sorted array and a target value, return the index if the target is found. If not, return ...

  3. iOS开发中添加PrefixHeader.pch要注意的问题

    在Xcode6.0已经不默认生成PrefixHeader.pch文件了,而PrefixHeader.pch文件对我们开发带来的便利性是不言而喻的,所以我们怎么在工程中添加PrefixHeader.pc ...

  4. nodejs的mysql模块学习(九)连接池集群

    连接池集群 连接池集群可以提供多个主机连接 创建连接池集群 //创建连接池集群 var poolCluster = mysql.createPoolCluster(); //添加配置 config是一 ...

  5. oracle数据库例外处理与视图

    pl/sql例外处理 例 当输入编号没有时的例外处理 declare --定义 v_ename emp.ename%type; begin -- select ename into v_ename f ...

  6. 《算法导论》习题解答 Chapter 22.1-6(求universal sink 通用汇点)

    思路:设置两个游标i指向行,j指向列,如果arr[i][j]==1,则i=max{i+1,j},j++:如果arr[i][j]==0,则j=max{i+1,j+1}. 伪代码: has_univers ...

  7. [原创] Web UI 自动化日期控件的处理

    序 在构建自动化套件的过程中,日期操作是一件很重要也很频繁的事情.有的日期控件的div层级结构复杂,同一个类型的日期控件在多个子系统中的表现形式也大相径庭.多数工程师为了避免重复的工作,会封装抽象一个 ...

  8. jquery 的 ajax 在 非阻塞 时返回 XMLHttpRequest

    jquery 的 ajax 在 非阻塞 时返回 是 [object XMLHttpRequest] 对象(firefox 下 alert(对象名) 也可以直接看到对象类型) 返回的内容用 reques ...

  9. JS 获取WEB请求路径

    function getRealPath(){      //获取当前网址,如: http://localhost:8083/myproj/view/my.jsp       var curWwwPa ...

  10. angularJS图表-angular-flot

    1.首先需要在项目中引入的js文件有 <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.mi ...