库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)

静态库

之所以称为“静态库”,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。

静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。

特点

  • 可以实现共享代码
  • 不能再包含其他静态链接库
  • 本身包含了代码,地址符号表等,静态链接库的使用中,连接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中
  • 代码装载速度快,执行速度略比动态链接库快
  • 只需保证在开发者的计算机中有正确的 .a 文件,在以二进制形式发布程序时不需考虑在用户的计算机上 .a 文件是否存在及版本问题
  • 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;

创建

  1. 编写源文件,通过 gcc -c xxx.c 生成目标文件
  2. 使用 ar 命令归档目标文件,生成静态库
  3. 配合静态库,写一个使用静态库中的函数的头文件
  4. 链接静态库,生成可执行文件

例子

源文件

add.c 文件:

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

subtract.c 文件:

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

编译两个文件,生成目标文件 add.o subtract.o

gcc -c add.c subtract.c

归档目标文件,生成静态链接库 libmath.a

使用 ar 命令将目标文件压缩到一起,并且对其进行编号和索引,以便于查找和检索

ar rcv libmath.a add.o subtract.o

有关 ar 命令的使用,makepage 有详细的说明,常用的选项是:

c -- 如果库文件不存在,生成新的库文件,并不打印警告
r -- 代替库中已有的文件或者插入新的文件
v -- 输出详细信息
d -- 删除库中的某个目标文件
t -- 列出归档文件中包含的目标文件

我们生成的库文件名字必须形如 libxxx.a,这样我们在链接库的时候,就可以使用 -lxxx。

当我们链接时,指定 -lxxx,链接器就会在指定的目录查找 libxxx.a 或 libxxx.so 文件

编写头文件 mymath.h

#ifndef _MYMATH_H_
#define _MYMATH_H_ int add(int, int);
int subtract(int, int); #endif

使用静态库

编写文件 main.c

#include <stdio.h>
#include "mymath.h" int main()
{
printf("%d, %d\n", add(, ), subtract(, )); return ;
}

编译链接

gcc main.c -L. -lmath

这里,-L 指定搜索链接库的包含当前目录

使用Makefile

.PHONY: all
all: build target build: libmath.a libmath.a: add.o subtract.o
ar rc $@ add.o subtract.o add.o: add.c
gcc -c $<
subtract.o: subtract.c
gcc -c $< target: a.out
a.out: main.c
gcc main.c -L. -lmath .PHONY: clean
clean:
rm *.o libmath.a a.out

最新文章

  1. Android 笔记 文件存取 day5
  2. HDU 5923 Prediction
  3. .NET 配置文件简单使用
  4. html 中添加背景音乐
  5. printf()函数
  6. 关于FireFox类VIM插件。VimPerator
  7. 【高可用HA】Apache (1) —— Mac下安装Apache Httpd到自定义路径(非/etc/apache2)
  8. POJ 3335 Rotating Scoreboard(半平面交求多边形核)
  9. VS2008 未找到编译器可执行文件 csc.exe【当网上其他方法试玩了之后不起作用的时候再用这个方法】
  10. pl/sql 关于变量定义的问题
  11. 七日筑基——C#第二天
  12. php 函数积累第一天
  13. 使用es6特性封装async-mysql
  14. leetcode刷题指南
  15. 我手写的简易tomcat
  16. Android Studio工程项目打包成SDK(jar或aar格式)
  17. es6(一)
  18. Go语言规格说明书 之 select语句(Select statements)
  19. QT 5.12 安装MinGW 7.3.0 32bit
  20. Arduino和C51开发光敏传感器

热门文章

  1. hydra 常用的命令
  2. linux命令整理
  3. 【jQuery】jQuery中的事件捕获与事件冒泡
  4. 1874 football game(三分法and method to compute the area of trianngle)
  5. (转)浅谈PostgreSQL的索引
  6. hdu 5971 Wrestling Match
  7. 设置 jsp 表格相邻两行的颜色不一样
  8. 「LG4782 模板 2-SAT 问题」
  9. [转]JOGL安装
  10. 智能门锁超低功耗:SI522(13.56芯片)替代MFRC522\FM17522