ar linux 静态库
2012-12-24 15:09:23 shanzhizi 阅读数 744

当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量。这里介绍命令ar,用来对库操作。 
1.ar基本用法
  ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。
  下面是ar命令的格式:
  ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...
  例如我们可以用ar rv libtest.a hello.o hello1.o
生成一个库,库名字是test,链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-'字符,也可以
没有。下面我们来看看命令的操作选项和任选项。现在我们把{dmpqrtx}部分称为操作选项,而[abcfilNoPsSuvV]部分称为任选项。
  {dmpqrtx}中的操作选项在命令中只能并且必须使用其中一个,它们的含义如下:

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


  下面在看看可与操作选项结合使用的任选项:

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

对编译好的.o文件,可以合成一个.a文件,就是静态库,用ar命令:


ar rcs libMyLib.a  test1.o test2.o ... testN.o


查看.a包含哪些.o:

ar tv libMyLib.a


链接自己的.a文件时,可以不用-L 和-l命令,因为这2个命令有坑(依赖关系, 链接出现“未定义的引用”错误),可以直接在.o文件后面加上.a的文件路径和名称的:

g++ LINKFLAG  main.o  libMyLib.a  -o test.out


如果有多个项目用到了同一个静态库,并且用不同-D编译选择,那么用到的每类-D选项都要编译一个.a,不同的项目链接对应.a,这样才不会出错的。

2016-04-08 09:23:41 mosesmo1989 阅读数 250

我使用过的Linux命令之ar - 创建静态库.a文件

本文链接:http://codingstandards.iteye.com/blog/1142358    (转载请注明出处)

 

用途说明

创建静态库.a文件。用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚本中用到。关于Linux下的库文件、静态库、动态库以及怎样创建和使用等相关知识,参见本文后面的相关资料【3】《关于Linux静态库和动态库的分析》。

 

常用参数

格式:ar rcs libxxx.a xx1.o xx2.o

参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。【1】

参数c:创建一个库。不管库是否存在,都将创建。

参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果.a文件缺少索引,可以使用ranlib命令添加)

 

格式:ar t libxxx.a

显示库文件中有哪些目标文件,只显示名称。

 

格式:ar tv libxxx.a

显示库文件中有哪些目标文件,显示文件名、时间、大小等详细信息。

 

格式:nm -s libxxx.a

显示库文件中的索引表。

 

格式:ranlib libxxx.a

为库文件创建索引表。

 

使用示例

示例一 在shell脚本中使用

 

Bash代码  

收藏代码

  1. OS=`uname -r`  
  2. ar rcs libhycu.a.$OS *.o  

 

 

示例二 在makefile中使用

Makefile代码  

收藏代码

  1. $(BIN1): $(BIN1_OBJS)  
  2.         ar rcs $@ $^  

 

 

示例三 创建并使用静态库

第一步:编辑源文件,test.htest.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。

vi test.h test.cmain.c

第二步:将test.c编译成目标文件。

gcc -c test.c

如果test.c无误,就会得到test.o这个目标文件。

第三步:由.o文件创建静态库。

ar rcs libtest.atest.o

第四步:在程序中使用静态库。

gcc -o main main.c-L. -ltest

因为是静态编译,生成的执行文件可以独立于.a文件运行。

第五步:执行。

./main

 

示例四 创建并使用动态库

第一步:编辑源文件,test.htest.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。

vi test.h test.cmain.c

第二步:将test.c编译成目标文件。

gcc -c test.c

前面两步与创建静态库一致。

第三步:由.o文件创建动态库文件。

gcc -shared -fPIC -olibtest.so test.o

第四步:在程序中使用动态库。

gcc -o main main.c-L. -ltest

当静态库和动态库同名时,gcc命令将优先使用动态库。

第五步:执行。

LD_LIBRARY_PATH=../main

 

示例五 查看静态库中的文件

[root@node56 lib]# ar -t libhycu.a

base64.c.o

binbuf.c.o

cache.c.o

chunk.c.o

codec_a.c.o

...

xort.c.o

[root@node56 lib]#

[root@node56 lib]# ar -tv libhycu.a

rw-r--r--0/0   7220 Jul 29 19:18 2011 base64.c.o

rw-r--r--0/0   2752 Jul 29 19:18 2011 binbuf.c.o

rw-r--r-- 0/0 19768 Jul 29 19:18 2011 cache.c.o

...

rw-r--r--0/0   4580 Jul 29 19:18 2011 xort.c.o

[root@node56 lib]#

[root@node56 lib]# nm -s libhycu.a | less

 

Archive index:

Base64Enc inbase64.c.o

GetBase64Value inbase64.c.o

Base64Dec inbase64.c.o

encode64 inbase64.c.o

decode64 inbase64.c.o

check64 inbase64.c.o

test64 in base64.c.o

...

chunk_alloc inchunk.c.o

[root@node56 lib]#


2016-10-19 23:12:55 stpeace 阅读数 9569

       在之前的博文中,  我们说过静态库的制作和使用方法, 今天, 我们再来说说静态库中到底有什么。

       我们已经很熟悉linux中的tar命令了, 英文原文是tape archive,  磁带归档。 今天, 我们要说的是ar命令, 也就是archive, 也是归档。 其实, 对目标文件.o进行归档, 就形成了静态库.a文件。实际上, ar命令可以对一个或者多个目标文件.o进行归档, 形成一个静态库.a文件。 可见, 静态库还是很简单的,无非就是众多目标文件的集合。

 

       1. ar  rcs ------   把目标文件转换为静态库

       2. ar -vt libtest.a  查看静态库中有哪些目标文件  (实际上就相当于: objdump -a libtest.a)

       3. ar -x libtest.a   将静态库中的目标文件取(解压)出来, 放在当前目录下。


       静态库就这么简单。 实际上, 我认为, 从广义上来讲: 目标文件.o等价于静态库.a, 它们是可逆的。





        

2019-01-14 13:55:19 kunkliu 阅读数 24

转载地址:https://blog.csdn.net/yangxuan12580/article/details/51315077

linux ar 命令的使用说明:
用途说明
   创建静态库.a文件。《关于Linux静态库和动态库的分析》。


   格式:ar rcs  libxxx.a xx1.o xx2.o


Linux ar命令参数:  
指令参数  
   -d  删除静态库中的成员文件。  
   -m  变更成员文件在静态库中的次序。  
   -p  显示静态库中的成员文件内容。  
   -q  将文件附加在静态库的末端。  
   -r  将文件插入静态库中。  
   -t  显示静态库中所包含的文件。  
   -x  静态库中取出成员文件。 


选项参数  
   a<成员文件>  将文件插入静态库中指定的成员文件之后。  
   b<成员文件>  将文件插入静态库中指定的成员文件之前。  
   c  创建一个静态库,不管库是否存在,都将创建。  
   f  为避免过长的文件名不兼容于其他系统的ar指令指令,因此可利用此参数,截掉要放入静态库中过长的成员文件名称。  
   i<成员文件>  将文件插入静态库中指定的成员文件之前。  
   o  保留备静态库中文件的日期。  
   s  若静态库中包含了对象模式,可利用此参数建立备存文件的符号表。  
   S  不产生符号表。  
   u  只将日期较新文件插入静态库文件中。  
   v  程序执行时显示详细的信息。  
   V  显示版本信息。


使用示例:
   格式:ar t libxxx.a
       显示库文件中有哪些目标文件,只显示名称。
   格式:ar tv libxxx.a
       显示库文件中有哪些目标文件,显示文件名、时间、大小等详细信息。
   格式:nm -s libxxx.a
       显示库文件中的索引表。
   格式:ranlib libxxx.a
       为库文件创建索引表。


  创建并使用静态库:
   1:编辑源文件,test.h test.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。
   2:将test.c编译成目标文件。
    gcc -c test.c
    如果test.c无误,就会得到test.o这个目标文件。
   3:由.o文件创建静态库。
    ar rcs libtest.a test.o
   4:在程序中使用静态库。
    gcc -o main main.c -L. -ltest
    因为是静态编译,生成的执行文件可以独立于.a文件运行。
   5:执行。
    ./main


  创建并使用动态库
   1:编辑源文件,test.h test.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。
   
   2:将test.c编译成目标文件。
    gcc -c test.c
    前面两步与创建静态库一致。
   3:由.o文件创建动态库文件。
    gcc -shared -fPIC -o libtest.so test.o
   4:在程序中使用动态库。
    gcc -o main main.c -L. -ltest
    当静态库和动态库同名时,gcc命令将优先使用动态库。
   5:执行。
    LD_LIBRARY_PATH=. ./main

没有更多推荐了,返回首页