链接库是windows的术语,但对于Linux来说,其概念是一样的。我们通常会把一些相似或相近功能的程序生成链接库,这样的好处是:

    1)便于共享,开发软件时如需要相同功能时,不需要将大量重复的代码整合到工程当中,直接调用即可。

    2)便于保密,链接库是二进制的,源代码是不可见的。

  链接库有动态与静态两种,Linux动态库通常用.so为后缀,静态库用.a为后缀。

  (1)静态链接,在这种链接方式下,函数代码将从其所在的静态链接库中拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。

  (2)动态链接,在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的 名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。

  对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上的损害。

  静态库和动态库的区别

  1.利用静态函数库编译成的文件比较大,因为整个函数库的数据会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

  2.相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。

  使用静态库的好处:

  1,模块化,分工合作

  2,避免少量改动经常导致大量的重复编译连接

  3,也可以重用,注意不是共享使用

  使用动态库的好处:

  1,可以将最终可执行文件体积缩小

  2,多个应用程序共享内存中得同一份库文件,节省资源

  3,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。

  无论是静态库文件还是动态库文件,都是由目标文件(即 .o 文件)创建的,注意库中函数不能有main函数。

  静态库的应用

  1) 静态库的创建

    静态库文件的命名规范是以lib开头,以.a结尾。如libmymath.a

    ar cr libmymath.a mymath.o

  2) 静态库的使用

    ①直接链接

    gcc main.c libmymath.a

    ②在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后再用gcc命令生成目标文件时指明所使用的静态库名(是mymath 而不是libmymath.a ),gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会自动在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。

    gcc main.c -L. -lmymath

    参数说明:-L指明静态库文件所在路径,-l指明所要使用的静态库。

  动态库的应用

  1) 动态库的创建

    动态库文件名命名规范与静态库类似,以lib开头,以.so结尾。如:libmymath.so。

    gcc -shared -fPCI -o libmymath.so mymath.o

    注意-fPIC选项。PIC指Position Independent Code。共享库要求有此选项,以便实现动态连接(dynamic linking)。表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

  2) 动态库的使用

    ①直接链接

    gcc main.c ./libmymath.so 

    ②与静态库的使用基本一致,参数意义也相同,编译器会先搜索libxxx.so文件,如果没有找到,继续搜索libxxx.a(静态库)

    gcc main.c -L. -lmymath

    

    加载动态库生成的可执行文件运行时同样需要使用该动态库,因此必须告诉程序该动态库的路径,否则程序运行将会出错。

    为了让执行程序顺利找到动态库,有三种方法:

      ①把库拷贝到/usr/lib和/lib目录下。

      ②在LD_LIBRARY_PATH环境变量中加上库所在路径。例如动态库libmymath.so在当前目录下。‘.’表示当前目录,用‘:’隔开

       使用命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

      ③修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行sudo ldconfig刷新(需要超级用户权限)。

  注:

    查看依赖动态库库命令:ldd

    查看可执行文件的符号:nm

C语言之链接库的更多相关文章

  1. Linux环境下c语言静态链接库和动态链接库创建和使用

    库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...

  2. c语言静态链接库

    1 获得lib文件 vc++ 6.0中 新建 Win32 Static Library项目,命名为libTest 新建lib.h文件,代码如下 #ifndef LIB_H #define LIB_H ...

  3. C语言编写静态链接库及其使用

    本篇讲述使用C语言编写静态链接库,而且使用C和C++的方式来调用等. 一.静态库程序:执行时不独立存在,链接到可执行文件或者动态库中,目标程序的归档. 1.用C编写静态库步骤 a.建立项目(Win32 ...

  4. C语言动静态链接库使用(笔记)

    看了视频一直没空写........... C静态链接库不用说了跟你写在cpp文件里的函数一样不会有单独的模块 不再赘述生活中用的比较少 例子 .h文件 int Plus(int x, int y); ...

  5. vc下的静态链接库与动态链接库(一)

    一.静态库与动态库的区别 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Lib ...

  6. ZeroMQ接口函数之 :zmq_version – 返回ZMQ链接库的版本

    ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_version zmq_version(3)          ØMQ Manual - ØMQ/4.1.0 Na ...

  7. App开发流程之数据持久化和编译静态链接库

    先记录数据持久化. iOS客户端提供的常用数据持久化方案:NSUserDefaults代表的用户设置,NSKeydArchiver代表的归档,plist文件存储,SQLite数据库(包括上层使用的Co ...

  8. Linux链接库四(多个库文件链接顺序问题)

    最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于unde ...

  9. linux下静态链接库的用法

    最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于unde ...

随机推荐

  1. H - String painter

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...

  2. 基于http的软件仓库

    这是企业中常用的方法 比如一台服务器准备好了,公司必然要安装一些应用 这时可以用这种方法批量安装应用 运行一条命令,服务器就会自己去连接软件仓库,去下载来安装. [root@webmaster htm ...

  3. 多线程:『GCD』详尽总结

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到:1. GCD 简介2. GCD 任务和队列3. ...

  4. springMVC-上传图片

    SpringMVC文件上传与下载 上传图片 配置多媒体文件解析器 配置虚拟目录 在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加: <Context doc ...

  5. Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理

    http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...

  6. Windows server 2003 + IIS6 搭建Asp.net MVC运行环境

    安装.Net Framework4.0.下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=17718 安装WindowsServ ...

  7. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  8. AJPFX关于collection总结

    Collection接口是该层次结构的根接口,该接口的所有子接口或实现子类集合都可以用Iterator迭代器进行取出.Collection有两个常见子接口,即为List和Set,其中List集合可以用 ...

  9. kafka系列一:单节点伪分布式集群搭建

    Kafka集群搭建分为单节点的伪分布式集群和多节点的分布式集群两种,首先来看一下单节点伪分布式集群安装.单节点伪分布式集群是指集群由一台ZooKeeper服务器和一台Kafka broker服务器组成 ...

  10. Java——HashSet和TreeSet的区别

    HashSetHashSet有以下特点 不能保证元素的排列顺序,顺序有可能发生变化 不是同步的 集合元素可以是null,但只能放入一个null当向HashSet集合中存入一个元素时,HashSe ...