ar语法:
1 |
ar [-] [必要参数] [可选参数] [成员文件] |
ar 命令:将多个文件打包到一个文件中,也可以从打包的文件中提取文件,且打包的文件保留原来的属性
必要参数
1 2 3 4 5 6 7 |
-d 删除打包文件中的成员文件 -m 变更成员文件在打包文件中的次序 -p 显示打包文件中的成员文件内容 -q 将问家附加在打包文件末端 -r 将文件插入打包文件中 -t 显示打包文件中所包含的文件 -x 从打包文件中提取文件 |
选择参数
1 2 3 4 5 6 7 8 9 10 11 |
a<成员文件> 将文件插入打包文件中指定的成员文件之后 b<成员文件> 将文件插入打包文件中指定的成员文件之前 c 建立打包文件 f 保持其他系统ar命令兼容,截掉过长的文件名 i<成员文件> 与“b” 参数作用相同 o 保留打包文件的文件信息 s 创建档案文件的符号表 S 不创建档案文件的符号表 u 与“r”一起使用,替换打包文件中已经修改的文件 v 显示详细的处理信息。 V 显示版本信息 |
//==============================================================================================//
不论你是否遇到过或者想到过这样的情况,在一个库中添加另一个库,这个方法对你们来说都是及其有用的。因为我在网上搜索了半天还没有搜索到与此方法相关的文章。我已经测试过了通过这种方法生成的库是完全可用的,而且非常方便。通过在实际的项目中我学到了这个很好的方法,所以在这里给大家介绍一个,希望对大家有帮助。大家就不用走更多的弯路
ar命令的操作选项和任选项我就不介绍了,很简单,网上也有很多文章在介绍,随便看看就可以了。如果你不知道,还是应该去先去看看再来这篇文章。
如果我们简单的通过ar命令把几个.o文件,如yuer1.o yuer2.o yuer3.o 和 yucom1.a(hello1.o hello2.o)再此打包成libyuerapi.a是不可以行的,因为在libyuerapi.a中保留了yucom1.a原文件,而不是把yucom1.a中的.o文件解压后在打包到libyuerapi.a中,而我们希望的就是这样的结果。那我们该怎么办呢?当然有一个笨笨的方法,把yucom1.a中的文件逐个提取出来,然后在打包到libyuerapi.a中,但这样做也不是很直观,方便,因为你解压出来的这些临时.o文件,肯定要删除嘛,你怎么在yuer1.o yuer2.o yuer3.o …众多.o文件中删除这里临时文件呢,其实也很麻烦的。所以今天我就来给大家介绍另一种方法,那就是ar脚本。在网上我始终没有搜到搜到关于ar脚本方面的知识,这些都是我通过在实际的项目中总结出来的。所以不完全,但也能实现我们的目的了,以后遇到相关的脚本,我还会再添加到这篇文章中来的。
假设,我们在当前目录下有libyucom1.a 和 yuer1.o yuer2.o yuer3.o文件,其中libyucom1.a中包含这几个目标文件hello1.o hello2.o 。我们现在想把这四个文件打包成一个libyuerapi.a的库文件以提供给其他的程序使用。
第一步:
我们在命令终端中一次输入
1 2 3 4 |
echo CREATE libyuerapi.a > ar.mac 回车 echo SAVE >> ar.mac 回车 echo END >> ar.mac 回车 ar -M < ar.mac |
我们可一个通过cat ar.mac看到ar.mac文件中的内容,而且我们也可以看到有一个libyuerapi.a生成了。目前其实里面什么都没有。
第二步:
上一步我们已经成功的创建了libyuerapi.a文件,现在我们向其中添加.o文件
1 2 3 |
ar -q libyuerapi.a yuer1.o ar -q libyuerapi.a yuer2.o ar -q libyuerapi.a yuer3.o |
第三步:
把libyucom.a添加到libyuerapi.a库文件中
我们以同样的方式创建一个ar.mac文件
1 2 3 4 5 |
echo OPEN libyuerapi.a > ar.mac echo ADDLIB libyucom1.a >> ar.mac echo SAVE >> ar.mac echo END >> ar.mac ar -M < ar.mac |
注意其中使用的重定向符: “>” “>>” “<“不要些错了。
好了现在我们就成功的将libyucom1.a中的.o文件打包到libyuerapi.a库文件中了,我们只要包含libyuerapi.a对应的头文件就可以使用其中的函数了。呵呵,是不是一下感觉豁然开朗了阿。(实验后,发现原先libyuerapi.a yuer1\2\3.o三个文件,会多出一个temp_api.a则包含libyuecom1.a里面的.o文件)
Makefile的样例,大家可以参考一下。
我们首先创建一个tool.mak
内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
define BUILD_LIBRARY $(if $(wildcard $@),@$(RM) $@) $(if $(wildcard ar.mac),@$(RM) ar.mac) $(if $(filter lib%.a, $^), @$(ECHO) CREATE $@ > ar.mac @$(ECHO) SAVE >> ar.mac @$(ECHO) END >> ar.mac @$(AR) -M < ar.mac ) $(if $(filter %.o,$^),@$(AR) -q $@ $(filter %.o, $^)) $(if $(filter %.a, $^), @$(ECHO) OPEN $@ > ar.mac $(foreach LIB, $(filter lib%.a, $^), @echo ADDLIB $(LIB) >> ar.mac ) @$(ECHO) SAVE >> ar.mac @$(ECHO) END >> ar.mac @$(AR) -M < ar.mac @$(RM) ar.mac ) endef |
然后我们创建一个Makefile
内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
CC = gcc AR = ar RM = rm CP = cp ECHO = echo INCLUDES = -I./ CFLAGS += -O2 $(INCLUDES) include tool.mak #包含子makefile TARGET = libyuerapi.a LIBS = yucom1.a OBJS = yuer1.o yuer2.o yuer3.o all:$(TARGET) $(TARGET):$(OBJS) $(LIBS) <TAB-SPACE>$(BUILD_LIBRARY) %.o:%.c $(CC) -c $(CFLAGS) $< -o $@ clean: -$(RM) *.o $(TARGET) |
写完后,你就可以通过ar -t libyuerapi.a查看libyuerapi.a的文件列表了。他显示的是
1 2 3 4 5 6 |
yuer1.o yuer2.o yuer3.o yuer4.o hello1.o hello2.o |
而不是:
1 2 3 4 5 |
yuer1.o yuer2.o yuer3.o yuer4.o libyucom1.a |
到此,我们的目标也就完成了,不知道你是不是正在找这样一种方法呢?
如果有问题可以发邮件[email protected]与我联系或直接留言。目前这个tool.mak的BUILD_LIBRARY只能连接当前目录中的一个或多个库,如果依赖列表里面还有其他目录的库,则还需要一个变量来负责从指定的目录中搜索库,将搜索到的库,按上述的方法添加到BUILD_LIBRARY中。
发表评论
要发表评论,您必须先登录。