操作静态库命令工具 ar

2019-11-22  本文已影响0人  执拗的男孩

Linux ar命令用于建立或修改备存文件,或是从备存文件中抽取文件。
ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。

#语法
ar[-dmpqrtx][cfosSuvV][a<成员文件>][b<成员文件>][i<成员文件>][备存文件][成员文件]

参数:

必要参数:
-d  删除备存文件中的成员文件。
-m  变更成员文件在备存文件中的次序。
-p  显示备存文件中的成员文件内容。
-q  将文件附加在备存文件末端。
-r  将文件插入备存文件中。
-t  显示备存文件中所包含的文件。
-x  自备存文件中取出成员文件。

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

ar -r打包文件

$ ar rv two.bak *.c  //打包以.c结尾的文件 
ar: 正在创建 two.bak
a - a.c
a - b.c
a - c.c
a - d.c 

ar -t显示打包文件的内容

$ ar -t two.bak 
a.c
b.c
c.c
d.c

ar -d删除打包文件的成员文件

$ ar -d two.bak a.c b.c c.c 
$ ar t two.bak       
d.c

ar -p显示打包文件的成员文件内容

$ ar -p two.bak d.c 

执行ar命令遇到的问题

$ ar -x libJDPay.a
ar: libJDPay.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
ar: libJDPay.a: Inappropriate file type or format

解决
是因为该.a文件包含了多个cpu架构,比如armv7,armv7s,arm64等,此时可以用如下命令
首先需要判断当前.a文件包含了 那些CPU架构,使用指令:

$ otool -vf libJDPay.a
Fat headers
fat_magic FAT_MAGIC
nfat_arch 4
architecture armv7
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7
    capabilities 0x0
    offset 88
    size 944560
    align 2^2 (4)
architecture i386
    cputype CPU_TYPE_I386
    cpusubtype CPU_SUBTYPE_I386_ALL
    capabilities 0x0
    offset 944648
    size 953768
    align 2^2 (4)
architecture x86_64
    cputype CPU_TYPE_X86_64
    cpusubtype CPU_SUBTYPE_X86_64_ALL
    capabilities 0x0
    offset 3028992
    size 1001856
    align 2^3 (8)
architecture arm64
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64_ALL
    capabilities 0x0
    offset 1898416
    size 1130576
    align 2^3 (8)
Archive : libJDPay.a

然后此时使用指令分别进行如下操作:

$ lipo libname. a -thin armv7 -output libname_armv7.a
$ lipo libname. a -thin arm64 -output libname_armv64.a

ar -t 查看静态库中文件目录

$ ar -t libJDPay_arm64.a
__.SYMDEF
JDPAuthSDK.o
JDPAuthLoading.o
CB_DES.o
JDPAuthURICode.o
JDPADeviceUtils.o
JDPAuthWebViewController.o
JDPBase64.o
JDPAOpenUDID.o
JDPayModule.o
NSBundle+JDPaySubBundle.o
JDPayURLRequestManager.o
JDPayFoundationModule.o
JDPayFoundation_vers.o
JDPayBizURLRequestManager.o
JDPURICode.o
JDPCJSONSerializer.o
JDPCJSONDeserializer.o
CDataScanner_Extensions.o
JDPRequestConst.o
JDPCDataScanner.o
JDPCJSONScanner.o
JDPReachability.o
KBJSONSerializing.o
JDPayNetworkModule.o
NSDictionary_JSONExtensions.o
JDPayNetwork_vers.o

ar -x 解压.a 文件

$ ar -x libname_armv7.a

看到文件目录下有很多.o的静态库文件,这时将不同架构下的.o文件合并

上一篇 下一篇

猜你喜欢

热点阅读