Linux C/C++编程之(九)静态库的制作和使用

一、概述

Linux C/C++编程之(九)静态库的制作和使用

二、静态库的优缺点

优点:

  • 寻址方便,速度快
  • 库被打包到可执行程序中,直接发布可执行程序即可使用

缺点:

  • 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大
  • 如果静态函数库改变了,那么你的程序必须重新编译

使用场合:

  • 在核心程序上使用,保证速度,可忽视空间
  • 主流应用于80、90年代,现在很少用

三、静态库的制作

(1)制作步骤

1)编译得到 *.o文件

gcc a.c b.c c.c -c

2)打包得到静态库 libmytest.a(就是一个打包.o文件的过程)

ar rcs libmytest.a a.o b.o c.o
  • ar工具不包含在gcc中
  • r–>将文件插入静态库中
  • c–>创建静态库,不管库是否存在
  • s–>写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。

查看库中的符号(函数、全局变量等):nm libmytest.a

3)使用静态库

gcc + 源文件 + -L静态库路径 + 静态库名 + -l头文件目录 + o可执行文件名
gcc main.c -L ./-lmytest -l ./ -o app
  • -L–>指定库所在的路径
  • -l–>指定库的名字
    • 去掉前缀lib
    • 去掉后缀 .a
    • 只留下中间部分
  • -l–>头文件目录位置
gcc + 源文件 + 头文件 + libxxx.a

生成的静态库需要跟对应的头文件同时发布

  • 头文件中存放的是函数接口(函数声明)

(2)实际操作

文件内容及路径分布如下:

gxl@gxl-virtual-machine:~/linux/jingtai$ tree
.
├── include
│   └── head.h
├── lib
├── main.c
└── src
    ├── add.c
    └── sub.c

//head.h

//head.h
#include<stdio.h>

int add(int a, int b);
int sub(int a, int b);

Linux C/C++编程之(九)静态库的制作和使用
//add.c

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

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

Linux C/C++编程之(九)静态库的制作和使用
//sub.c

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

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

Linux C/C++编程之(九)静态库的制作和使用

#include "head.h"

int main(void)
{
	int a = 10, b = 10;
	
	printf("%d + %d is %d
", a, b, add(a, b));
	printf("%d - %d is %d
", a, b, sub(a, b));
	
	return 0;
}

Linux C/C++编程之(九)静态库的制作和使用

  • 编译为 .o 文件,进入到 src 目录下执行:
    Linux C/C++编程之(九)静态库的制作和使用

  • 将 .o 文件打包,制作成 libCalc.a 静态库
    Linux C/C++编程之(九)静态库的制作和使用
    编译时需要加静态库名(记得路径),-I 包含头文件

  • 使用静态库编译 main.c并执行 main,我们将 libCalc.a 移动到上层的 lib 中并退回到 calc 目录,编译 main.c 并执行:
    Linux C/C++编程之(九)静态库的制作和使用

  • 可以用 nm 命令查看文件内容:
    Linux C/C++编程之(九)静态库的制作和使用

四、静态库

Linux C/C++编程之(九)静态库的制作和使用