Linux 命令:ar

一、ar 命令核心概念

ar(archive)的核心作用是将多个目标文件(.o 文件)打包成一个静态库文件(通常以 .a 为后缀),程序编译时可以直接链接这个静态库,无需逐个引用目标文件。

  • 静态库:本质是多个目标文件的集合,链接时会被完整复制到最终的可执行文件中。
  • 常见使用场景:封装通用功能(如工具函数),方便项目复用和管理。

资料合集:https://pan.quark.cn/s/6fe3007c3e95https://pan.quark.cn/s/561de99256a5https://pan.quark.cn/s/985f55b13d94https://pan.quark.cn/s/d0fb20abd19a

二、ar 命令基本语法

bash 复制代码
ar [选项] [静态库文件名] [目标文件1] [目标文件2] ...

三、常用选项与核心用法

ar 命令的选项是其核心,最常用的组合是 rcs,下面拆解关键选项和用法:

选项 作用
-c 创建静态库(若库文件不存在则新建,存在则覆盖)
-r 将目标文件插入/替换到静态库中(已有同名文件则替换)
-s 为静态库生成索引(加快链接速度,等价于 ranlib 命令)
-t 列出静态库中包含的所有文件
-d 从静态库中删除指定文件
-x 从静态库中提取指定文件(不指定则提取全部)
1. 创建静态库(最常用)

假设你有两个目标文件 func1.ofunc2.o,要打包成 libmylib.a

bash 复制代码
# 核心命令:创建并生成索引,推荐固定用 rcs 组合
ar rcs libmylib.a func1.o func2.o
  • 静态库命名规范:通常以 lib 开头,.a 结尾(如 libxxx.a),方便编译器识别。
2. 查看静态库内容
bash 复制代码
# 列出 libmylib.a 中所有文件
ar t libmylib.a
# 输出示例:
# func1.o
# func2.o

# 更详细信息(含文件权限、大小等):加 -v 选项
ar tv libmylib.a
3. 从静态库删除文件
bash 复制代码
# 从 libmylib.a 中删除 func2.o
ar d libmylib.a func2.o
4. 提取静态库中的文件
bash 复制代码
# 提取 libmylib.a 中的 func1.o 到当前目录
ar x libmylib.a func1.o

# 提取全部文件(不加文件名)
ar x libmylib.a

四、完整使用示例(从编译到链接)

  1. 编写源文件 math.c(实现加法功能):
c 复制代码
// math.c
int add(int a, int b) {
    return a + b;
}
  1. 编译为目标文件:
bash 复制代码
gcc -c math.c -o math.o  # -c 只编译不链接,生成 math.o
  1. ar 创建静态库:
bash 复制代码
ar rcs libmath.a math.o
  1. 编写主程序 main.c 并链接静态库:
c 复制代码
// main.c
#include <stdio.h>
int add(int a, int b);  // 声明库函数

int main() {
    printf("3 + 5 = %d\n", add(3, 5));
    return 0;
}
  1. 编译并链接静态库:
bash 复制代码
# -L. 表示在当前目录找库,-lmath 表示链接 libmath.a(自动省略 lib 和 .a)
gcc main.c -o main -L. -lmath
  1. 运行程序:
bash 复制代码
./main
# 输出:3 + 5 = 8

五、注意事项

  1. ar 仅处理静态库 ,动态库(.so)需用 gcc -shared 生成,不适用 ar
  2. 若静态库更新(如替换目标文件),需重新用 ar rcs 生成(-s 确保索引更新)。
  3. 查看静态库的符号表(函数/变量名)可配合 nm 命令:nm libmath.a

总结

  1. ar 核心用途是创建/修改/提取静态库(.a 文件),最常用组合是 ar rcs 库名.a 目标文件
  2. 静态库命名遵循 libxxx.a 规范,链接时用 -lxxx 引用。
  3. ar t 查看库内容、ar x 提取文件、ar d 删除文件是高频辅助用法。
相关推荐
火车叼位1 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
予枫的编程笔记1 小时前
【Linux进阶篇】从基础到实战:grep高亮、sed流编辑、awk分析,全场景覆盖
linux·sed·grep·awk·shell编程·文本处理三剑客·管道命令
Sheep Shaun1 小时前
揭开Linux的隐藏约定:你的第一个文件描述符为什么是3?
linux·服务器·ubuntu·文件系统·缓冲区
Tfly__1 小时前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360
陈桴浮海1 小时前
【Linux&Ansible】学习笔记合集二
linux·学习·ansible
迎仔1 小时前
06-存储设备运维进阶:算力中心的存储管家
运维
生活很暖很治愈1 小时前
Linux——环境变量PATH
linux·ubuntu
?re?ta?rd?ed?2 小时前
linux中的调度策略
linux·运维·服务器
深圳市九鼎创展科技2 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
全栈工程师修炼指南2 小时前
Nginx | stream content 阶段:TCP 协议四层反向代理浅析与实践
运维·网络·网络协议·tcp/ip·nginx