静态库和动态库之间不同之处就在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大;动态库(共享库)的代码是在可执行程序运行时被载入内存的,在编译过程中仅简单的引用,因此代码体积较小

一、静态库和动态库的定义
1、静态库(.a)
程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库

下面打包实现一下静态库:

//add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a, int b);
#endif  //__ADD_H__

//add.c
#include "add.h"

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

//sub.h
#ifndef __SUB_H__
#define __SUB_H__
int sub(int a, int b);
#endif  //__SUB_H__

//sub.c
#include "sub.h"

int sub(int a, int b)
{
    return a-b;
}

//main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
     int a = 2;
     int b = 3;
     printf("add(2,3)=%d\n", a, b, add(a,b));
     a = 10;
     b = 5;
     printf("sub(10,5)=%d\n",a, b, sub(a,b));
}

静态项目打包成docker_静态项目打包成docker

* 注:(1) 由源文件编译生成一堆 .o文件,每个 .o文件里都包含这个这个编译单元的符号表
      (2)ar命令将很多 .o转换为.a,成静态库
      (3)测试目标文件生成之后,删掉静态库,程序照样可以运行

这样打包使用静态库就完成啦!!!

库搜索路径:

* 从左至右搜索-L指定的目录
* 由环境变量指定的目录(LIBRARY_PATH)
* 由系统指定的目录>*/usr/lib>*/usr/local/lib

2、动态库(.os)由gcc加特定参数编译产生

程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib。

eg:创建的动态库名为mymath,则动态库文件名libmymath.so。

(1)由.o文件创建动态库文件

静态项目打包成docker_动态库_02

// gcc -shared -fPCI -o libmymath.so math.o

shared:表示生成共享库格式
fPIC:产生位置无关码

(2)使用动态库

//  gcc main.o -o main -L. -l库名

-l:链接动态库,只要库名即可
-L:链接库所在的路程

3、静态库和动态库的比较
因为静态库被链接后库就直接被嵌入可执行文件中了,这样就会带来以下几个麻烦:
(1)系统空间被浪费,倘若多个程序链接同一个库,则每一个生成的可执行文件就都会有一个库的副本,因此就会浪费系统空间。(2)当我们发现库中有bug时,这就比较麻烦了,就要把链接该库的程序都找出来,然后重新编译

但是嘞,wuli动态库就刚好巧妙的弥补了静态库的弊端。因为动态库是在程序运行时被链接的,所以磁盘上必须保留一份副本,因此节约了磁盘空格。若果发现bug,我们只需用新的库将原来的替换掉就可以了