ar命令用于建立或修改备存文件,或是从备存文件中抽取文件。
ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。
当我们的程序中有经常使用的模块,而且这些模块在其他程序中也会用到,为了实现代码重用减少软件开发周期,我们可以将它们生成库,在需要的时候直接调用就可以了.
ar 命令
可以用来创建、修改和提取库(档案archives)
命令格式
ar [--plugin name] [-X32_64] [-]p[mod [relpos] [count]] archive [member...]
简述
库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。
p关键字指定执行的操作(必须指定其中之一)
[ mod ] 修饰符可能会跟在p关键字的后面,用来指定操作的行为变化
a | 在库的一个已经存在的模块后面增加一个新的文件。如果使用修饰符a,则应该为命令行中relpos参数指定一个已经存在的模块名。 |
b | 在库的一个已经存在的模块前面增加一个新的文件。如果使用修饰符b,则应该为命令行中relpos参数指定一个已经存在的模块名。 |
c | 创建一个库。不管库是否存在,都将创建。 |
D | 在确定性的模式中起作用? |
f | 在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,可以使用此参数将文件名截短,以保证与其它系统的兼容。 |
i | 在库的一个已经存在的模块前面增加新的文件。如果使用修饰符i,则应该为命令行中relpos参数指定一个已经存在的模块名。 |
l | 暂未使用 |
N | 与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。 |
o | 当提取成员时,保留成员的原始数据。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。 |
P | 进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以。这个选项将导致GNU ar匹配文件名使用完整的路径名,可以使用其他工具方便的从存档中提取一个文件。 |
s | 写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。 |
S | 不创建目标文件索引,这在创建较大的库时能加快时间 |
T | |
u | 一般说来,命令ar r...插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选项只用于r操作选项 |
v | 这个修饰符显示一个操作的详细、额外的信息 |
V | 显示ar的版本 |
ar忽略了最开始的选项-X32_64,是为了和AIX兼容。
实例
打包文件
[root@w3cschool.cc ~]# ls //显示当前目录文件
a.c b.c d.c install.log qte
anaconda-ks.cfg c.c Desktop
[root@w3cschool.cc ~]# ar rv one.bak a.c b.c //打包 a.c b.c文件
ar: 正在创建 one.bak
a - a.c
a - b.c
[root@w3cschool.cc ~]#
打包多个文件
[root@w3cschool.cc ~]# ar rv two.bak *.c //打包以.c结尾的文件
ar: 正在创建 two.bak
a - a.c
a - b.c
a - c.c
a - d.c
[root@w3cschool.cc ~]#
显示打包文件的内容
[root@w3cschool.cc ~]# ar t two.bak
a.c
b.c
c.c
d.c
[root@w3cschool.cc ~]#
删除打包文件的成员文件
[root@w3cschool.cc ~]# ar d two.bak a.c b.c c.c
[root@w3cschool.cc ~]# ar t two.bak
d.c
ar命令, 也就是archive, 也是归档。 其实, 对目标文件.o进行归档, 就形成了静态库.a文件。实际上, ar命令可以对一个或者多个目标文件.o进行归档, 形成一个静态库.a文件。 可见, 静态库还是很简单的,无非就是众多目标文件的集合。
1. 要创建一个库,请输入:
ar -v -q lib.a strlen.o strcpy.o
如果 lib.a 库不存在,则此命令创建它,并将文件 strlen.o 和 strcpy.o 的副本输入其中。如果 lib.a 库存在,则此命令在不检查相同成员的情况下,将新的成员添加到末尾。v 标志设置详细方式,在此方式中 ar 命令在其进行时显示进程报告。
2. 要显示库的目录,请输入:
ar -v -t lib.a
此命令列出了 lib.a 库的目录,显示类似于 ls -l 命令的输出的长列表。要只列出成员文件名称,则省略 -v 标志。
3. 要替换或添加新成员到库中,请输入:
ar -v -r lib.a strlen.o strcat.o
此命令替换成员 strlen.o 和 strcat.o。如果 lib.a 如示例 1 中显示的那样创建,则替换 strlen.o 成员。因为不存在名为 strcat.o 的成员,所以它被添加到库的末尾。
4. 要指定在何处插入新成员,请输入:
ar -v -r -b strlen.o lib.a strcmp.o
此命令添加 strcmp.o 文件,并将该新成员置于 strlen.o 成员之前。
5. 要更新一个已经更改过的成员,请输入:
ar -v -r -u lib.a strcpy.o
此命令替换现有 strcpy.o 成员,但仅当文件 strcpy.o 自从最后一次添加到库后已经修改时才替换它。
6. 要更改库成员的顺序,请输入:
ar -v -m -a strcmp.o lib.a strcat.o strcpy.o
此命令将成员 strcat.o 和 strcpy.o 移动到紧跟在 strcmp.o 成员之后的位置。保留 strcat.o 和 strcpy.o 成员的相对顺序。换句话说,如果在移动之前 strcpy.o 成员在 strcat.o 成员之前,那么(移动后)它依旧如此。
7. 要解压缩库成员,请输入:
ar -v -x lib.a strcat.o strcpy.o
此命令将成员 strcat.o 和 strcpy.o 分别复制到名为 strcat.o 和 strcpy.o 的文件。
8. 要解压缩并重命名一个成员,请输入:
ar -p lib.a strcpy.o >stringcopy.o
此命令将成员 strcpy.o 复制到一个名为 stringcopy.o 的文件。
9. 要删除一个成员,请输入:
ar -v -d lib.a strlen.o
此命令从 lib.a 库中删除成员 strlen.o。
10. 要从多个用 ld 命令创建的共享模块中创建一个压缩文档库,请输入:
ar -r -v libshr.a shrsub.o shrsub2.o shrsub3.o ...
此命令从名为 shrsub.o、shrsub2.o、shrsub3.o 等等的共享模块中创建名为 libshr.a 的压缩文档库。要编译并链接使用 libshr.a 压缩文档库的 main 程序,请使用以下命令:
cc -o main main.c -L/u/sharedlib -lshr
main 程序现在是可执行的。main 程序引用的任何符号(包含在libshr.a 压缩文档库中)已经因延迟分辨率而作了标记。-l 标志指定应在 libshr.a 库中搜索这些符号。
11. 要列出 lib.a 的内容(忽略任何 32 位目标文件),请输入:
ar -X64 -t -v lib.a
12. 要从 lib.a 解压缩所有 32 位的目标文件,请输入:
ar -X32 -x lib.a
13. 要列出 lib.a 中的所有文件,无论是 32 位、64 位或非对象,请输入:
ar -X32_64 -t -v lib.a