Linux 中的 ar 命令

制作静态库需要使用到 ar 命令, 首先来总览一下 ar 命令的用法.

1
ar [-][dmpqrtx][cfosSuvV] [a< 成员文件 >] [b< 成员文件 >] [i< 成员文件 >] [count] [备存文件] [成员文件]

制作静态库

假设有一个文件 test.c 需要做成静态库

首先使用编译器将源文件 test.c 编译成机器码 test.o

1
gcc -c test.c -o test.o

然后将机器码打包起来, 做成静态库.

常见的两种情况是使用 r 参数和使用 q 参数.

1
2
3
4
5
# r 参数会将 test.o 加入 libtest.a 中 
# 如果 test.o 已经存在, 则会替换
# c 参数, 创建 libtest.a 这个库, 不论是否存在都会创建
# s 建立库的符号表, 等同于对该库做 ranlib
ar rcs libtest.a test.o
1
2
3
# q 参数会将 test.o 追加入 libtest.a 中 
# 模块总是追加到库的结尾处
ar qcs libtest.a test.o

后面部分是关于 ar 命令的详细介绍.

必要参数

dmpqrtx 为必要参数, 在命令中只能并且必须使用其中一个, 它们的含义如下. (为了打包静态库过程的表述方便, 备存文件被称为库, 成员文件被成为模块)

  • d:删除库中模块。按模块原来的文件名指定要删除的模块。如果使用了选项参数 v 则列出被删除的每个模块。
  • m:变更库中模块次序。当库中如果有若干模块有相同的符号定义(如函数定义),则成员的位置顺序很重要。如果没有指定任选项,任何指定的成员将移到库的最后。也可以使用’a’,’b’,或’i’选项参数移动到指定的位置。
  • p:显示库中的模块内容到标准输出。如果指定选项参数 v,则在输出模块内容前,将显示模块的名字。如果没有指定模块的名字,所有库中的模块内容将显示出来。
  • q:快速追加。增加新模块到库的结尾处。并不检查是否需要替换。’a’,’b’,或’i’任选项对此操作没有影响,模块总是追加到库的结尾处。如果使用了选项参数 v 则列出每个模块。 这时,库的符号表没有更新,可以用’ar s’或 ranlib 来更新库的符号表索引。
  • r:在库中插入模块(已存在则替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar 显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
  • t:显示库的模块表清单。一般只显示模块名。
  • x:从库中提取一个成员。如果不指定要提取的模块,则提取库中所有的模块。

选项参数

选项参数可与必要参数结合使用.

  • a< 成员文件 >:在库的一个已经存在的成员后面增加一个新的文件。
  • b< 成员文件 >:在库的一个已经存在的成员前面增加一个新的文件。
  • i< 成员文件 >:在库的一个已经存在的成员前面增加一个新的文件。
  • l:暂未使用
  • c:创建一个库。不管库是否存在,都将创建。
  • f:在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,为避免过长的文件名不兼容于其他系统的 ar 指令指令,可以使用此参数将文件名截短,以保证与其它系统的兼容。
  • N:与 count 参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。
  • o:当提取成员时,保留成员的原始数据日期。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。
  • P:进行文件名匹配时使用全路径名。ar 在创建库时不能使用全路径名(这样的库文件不符合 POSIX 标准),但是有些工具可以。
  • s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做 ar s 等同于对该库做 ranlib。(若备存文件中包含了对象模式,可利用此参数建立备存文件的符号表)
  • S:不创建目标文件索引,这在创建较大的库时能加快时间。(不产生符号表)
  • u:一般说来,必要参数 r 插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选项只用于 r 操作选项。
  • v:命令执行时显示详细的信息。。
  • V:显示 ar 的版本。