美文网首页
操作静态库命令工具 ar

操作静态库命令工具 ar

作者: 执拗的男孩 | 来源:发表于2019-11-22 17:45 被阅读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文件合并

    相关文章

      网友评论

          本文标题:操作静态库命令工具 ar

          本文链接:https://www.haomeiwen.com/subject/soufwctx.html