函数库分为静态库和动态库

动态库(格式为libname.so[.主版本号.次版本号.发行号])。在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。

静态库是目标文件.a的归档文件(格式为libname.a)。如果在编译某个程序时链接静态库,则链接器将会搜索静态库并直接拷贝到该程序的可执行二进制文件到当前文件中;

看定义不太好理解,下面举例说明上述概念:

动态库

动态库(格式为libname.so[.主版本号.次版本号.发行号])。在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。

$ gcc -fPIC -Wall -c add.c
$ gcc -shared -o libadd.so add.o
$ gcc -o main main.c –ladd

在运行main前,需要注册动态库的路径。将库文件拷贝到/lib或者/usr/lib下(系统默认搜索库路径)。

$ cp libadd.so /lib        //通常采用的方法, cp lib*.so /lib
$ ./main

实例测试:

add.c

int add(int a, int b){
return a + b;
}

main.c

#include <stdio.h>
int add(int a, int b);
int main()
{
int res = add(3, 4);
printf("res = %d\n", res);
return 0;
}

这里我们要将add.c生成动态库使得main.c能编译运行。

gcc -fPIC -Wall -c add.c
gcc -shared add.o -o libadd.so
sudo cp libadd.so /usr/lib
gcc main.c -ladd

执行时将动态库(libadd.so)与a.out同时加载到代码段才能运行。当多个代码段需要用到一个libXXX时,并不会生成多个libXXX放入代码段,而是通过共享库。

当动态库升级时,以格式为libname.so[.主版本号.次版本号.发行号]命名,如现在将原来的libadd.so修改为libadd.so.1,那怎么让原来main.c文件中的add函数还能实现呢?——软链接


先穿插一个概念:

软链接

命令: $ ln -s filename1 filename2

功能: filename2 -> filename1

可以看到当链接建立时,file1 -> file,file1的大小为4B,file的大小为739B。可以用过 ls -lh查看链接。

软链接存储是路径,相当于file1是file的一个快捷方式,所以在查看file1的时候也是显示file的内容。


回到原来的问题,现在将原来的libadd.so修改为libadd.so.1,只要将libadd.so.1与libadd.so软链接即可。

sudo ln -s libadd.so.1 libadd.so
静态库
gcc -c add.c				//编译add.c生成add.o
ar crsv libadd.a add.o //对目标文件*.o进行归档,生成lib*.a,将库文件libadd.a拷贝到/lib或者/usr/lib下(系统默认搜索库路径)
gcc -o main main.c -ladd //-ladd表示链接库文件libadd.a/.so
./main

还是用上面同一个例子做测试:

main.c

#include <stdio.h>

int add(int, int);

int main()
{
int j = add(3, 4);
printf("%d\n", j);
return 0;
}

静态库是目标文件.a的归档文件(格式为libname.a)。如果在编译某个程序时链接静态库,则链接器将会搜索静态库并直接拷贝到该程序的可执行二进制文件到当前文件中;

所以当我们在删除库文件中libadd.a后还是可以编译执行main.c!


静态库与动态库的比较:

​ 动态库只在执行时才被链接使用,不是直接编译为可执行文件,并且一个动态库可以被多个程序使用故

可称为共享库

​ 静态库将会整合到程序中,在程序执行时不用加载静态库。 因此,静态库会使你的程序臃肿并且难以升

级,但比较容易部署。而动态库会使你的程序轻便易于升级但难以部署。

  二者的不同点在于代码被载入的时刻不同

  • 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大
  • 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小

Linux下静态库和动态库的更多相关文章

  1. linux下,一些关于动态库的问题:

    程序运行是加载动态库的几种方法: 第一种,通过ldconfig命令    ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令它,ldconfig命令通 ...

  2. linux下java调用.so动态库方法2: JNA

    摘自:http://blog.csdn.net/todorovchen/article/details/21319033 另请参见: http://blog.sina.com.cn/s/blog_8c ...

  3. Linux下编译tinyxml生成动态库

    首先去到sourceforge下载tinyxml的源码,https://sourceforge.net/projects/tinyxml/?source=dlp,最新版本是2.6.2. 将下载成功的t ...

  4. Linux下gcc编译控制动态库导出函数小结

    根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility(" ...

  5. 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用

    原文出处: 吴秦的博客    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学 ...

  6. 静态库和动态库的区别和win平台和linux平台代码实现

    静态库和动态库的区别   什么是库 库是写好的,现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说,库是一种可 ...

  7. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

  8. C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  9. (转)C++静态库与动态库

    转自:http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别, ...

  10. 【转】C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

随机推荐

  1. <jsp:include>动作元素,附:最易出错的一点

    先定义一个date.jsp,再定义一个main.jsp.用<jsp:include plage = "相对url地址" flush = "true"> ...

  2. hotel管理

    PS:这个界面

  3. 实现在同一界面打开putty终端连接工具

    用过putty的人可能知道,每打开一次啊putty程序只能开启一个连接,这个在实际运用中很不方便,反正我开ssh一般都是同时开四个窗口 其实有一个程序可以实现打开多个putty,下面是下载地址 htt ...

  4. <------------------字符流--------------------->

    FileWriter 字符输出流: 方法: 写入:write 刷新:flush public static void main(String[] args) throws IOException { ...

  5. nginx unit nodejs 模块试用(续)

      最新(应该是18 年了)nginx unit 发布了新的版本,对于nodejs 的支持有很大的改进,上次测试过,问题还是 比较多,这次使用新版本在测试下对于nodejs 的支持,以及以前block ...

  6. npm安装教程(vue.js)

    https://www.cnblogs.com/goldlong/p/8027997.html 首先理清nodejs和npm的关系: node.js是javascript的一种运行环境,是对Googl ...

  7. python3 TypeError: Unicode-objects must be encoded before hashing

    python3下,利用hash值对字符串进行md5加密时报错:TypeError: Unicode-objects must be encoded before hashing 原因是:python3 ...

  8. SqlServer语句

    1.增加列 增加int列,不为空并赋默认值为0 alter table Department add Status int not null default 0 with values 2.新建表:c ...

  9. Hanlp自然语言处理工具的使用演练

    Hanlp是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用.Hanlp具备功能完善.性能高效.架构清洗.语料时新.可自定义的特点:提供词法分析(中文分词.磁性标注.命名实体识 ...

  10. spark-streaming-kafka-0-8 和 0-10的使用区别

    一.spark-streaming-kafka-0-8_2.11-2.0.2.jar 1.pom.xml <!-- https://mvnrepository.com/artifact/org. ...