一、ar命令核心概念
ar(archive)的核心作用是将多个目标文件(.o文件)打包成一个静态库文件(通常以.a为后缀),程序编译时可以直接链接这个静态库,无需逐个引用目标文件。
- 静态库:本质是多个目标文件的集合,链接时会被完整复制到最终的可执行文件中。
- 常见使用场景:封装通用功能(如工具函数),方便项目复用和管理。
资料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
二、ar命令基本语法
ar[选项][静态库文件名][目标文件1][目标文件2]...三、常用选项与核心用法
ar命令的选项是其核心,最常用的组合是rcs,下面拆解关键选项和用法:
| 选项 | 作用 |
|---|---|
-c | 创建静态库(若库文件不存在则新建,存在则覆盖) |
-r | 将目标文件插入/替换到静态库中(已有同名文件则替换) |
-s | 为静态库生成索引(加快链接速度,等价于ranlib命令) |
-t | 列出静态库中包含的所有文件 |
-d | 从静态库中删除指定文件 |
-x | 从静态库中提取指定文件(不指定则提取全部) |
1. 创建静态库(最常用)
假设你有两个目标文件func1.o、func2.o,要打包成libmylib.a:
# 核心命令:创建并生成索引,推荐固定用 rcs 组合ar rcs libmylib.a func1.o func2.o- 静态库命名规范:通常以
lib开头,.a结尾(如libxxx.a),方便编译器识别。
2. 查看静态库内容
# 列出 libmylib.a 中所有文件ar t libmylib.a# 输出示例:# func1.o# func2.o# 更详细信息(含文件权限、大小等):加 -v 选项ar tv libmylib.a3. 从静态库删除文件
# 从 libmylib.a 中删除 func2.oar d libmylib.a func2.o4. 提取静态库中的文件
# 提取 libmylib.a 中的 func1.o 到当前目录ar x libmylib.a func1.o# 提取全部文件(不加文件名)ar x libmylib.a四、完整使用示例(从编译到链接)
- 编写源文件
math.c(实现加法功能):
// math.cintadd(inta,intb){returna+b;}- 编译为目标文件:
gcc -c math.c -o math.o# -c 只编译不链接,生成 math.o- 用
ar创建静态库:
ar rcs libmath.a math.o- 编写主程序
main.c并链接静态库:
// main.c#include<stdio.h>intadd(inta,intb);// 声明库函数intmain(){printf("3 + 5 = %d\n",add(3,5));return0;}- 编译并链接静态库:
# -L. 表示在当前目录找库,-lmath 表示链接 libmath.a(自动省略 lib 和 .a)gcc main.c -o main -L. -lmath- 运行程序:
./main# 输出:3 + 5 = 8五、注意事项
ar仅处理静态库,动态库(.so)需用gcc -shared生成,不适用ar。- 若静态库更新(如替换目标文件),需重新用
ar rcs生成(-s确保索引更新)。 - 查看静态库的符号表(函数/变量名)可配合
nm命令:nm libmath.a。
总结
ar核心用途是创建/修改/提取静态库(.a文件),最常用组合是ar rcs 库名.a 目标文件。- 静态库命名遵循
libxxx.a规范,链接时用-lxxx引用。 ar t查看库内容、ar x提取文件、ar d删除文件是高频辅助用法。