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

动态库(格式为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. [Educational Codeforces Round 55 (Rated for Div. 2)][C. Multi-Subject Competition]

    https://codeforc.es/contest/1082/problem/C 题目大意:有m个类型,n个人,每个人有一个所属类型k和一个能力v,要求所选的类型的人个数相等并且使v总和最大(n, ...

  2. LeetCode – Most Common Word

    Given a paragraph and a list of banned words, return the most frequent word that is not in the list ...

  3. 【spring源码分析】BeanDefinitionRegistryPostProcessor接口可自定义bean加入IOC

    自定义BeanDefinitionRegistryPostProcessor BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcesso ...

  4. access-control-allow-origin

    when use vastinspector to check our  vast response ,it  tiped : "no 'access-control-allow-origi ...

  5. tile38 复制配置

    基于复制我们可以保证tile38 server 的ha 环境准备 docker-compose 文件 说明里面多了一个webhook 的服务,可以不用管   version: "3" ...

  6. Linux期末复习题

    版权声明: https://blog.csdn.net/u014483914/article/details/36622451 1.More和less命令的差别         More命令通经常使用 ...

  7. WikiBooks/Cg Programming

    https://en.wikibooks.org/wiki/Cg_Programming Basics Minimal Shader(about shaders, materials, and gam ...

  8. unity3d常用组件及分析

  9. day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁

    一.线程     1.进程:资源的分配单位    线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...

  10. react 学习资料

    react 学习资料 项目 学习资料 react 中文版:https://doc.react-china.org/ react-router https://reacttraining.com/rea ...