小萝卜干的技术分享

15 object(s)
 

iOS开发:区分动态库和静态库

开发过程中,难免会遇到要手动导入第三方库的情况。当我们拿到某个第三方的库的时候,需要根据静态库和动态库的不同,在XCode中选择不同的链接方式。

那么如何区分是动态库还是静态库?

  1. 从文件名判断:以.a结尾的是静态库,以.tbd,.dylib结尾的是动态库
  2. framework可能是动态库,也可能是静态库,具体需要用命令去查询。以IJKPlayer为例:

    $ cd IJKMediaFramework.framework
    $ ls
    Headers            IJKMediaFramework    Info.plist        Modules
    $ file IJKMediaFramework 
    IJKMediaFramework: Mach-O universal binary with 2 architectures: [arm64:current ar archive] [arm_v7]
    IJKMediaFramework (for architecture arm64):    current ar archive
    IJKMediaFramework (for architecture armv7):    current ar archive

    以百度鹰眼定位的BaiduTraceSDK.framework为例:

    $ cd BaiduTraceSDK.framework
    $ ls
    BaiduTraceSDK    Headers        Info.plist    Modules
    $ file BaiduTraceSDK 
    BaiduTraceSDK: Mach-O universal binary with 2 architectures: [arm_v7:Mach-O dynamically linked shared library arm_v7] [arm64]
    BaiduTraceSDK (for architecture armv7):    Mach-O dynamically linked shared library arm_v7
    BaiduTraceSDK (for architecture arm64):    Mach-O 64-bit dynamically linked shared library arm64

    如果是静态库,则会显示ar archive字样,如果是动态库,则会显示dynamically linked shared library字样

这样,我们就做到了将静态库与动态库进行区分。

另外,目前新版的XCode中已经不再区分Embed与Link了,统一在 Frameworks, Libraries and Embedded Content中进行添加处理。当添加一个framework的时,右边的Embed可以选择:

  1. Do Not Embed (这个是用来添加静态库的)
  2. Embed & Sign(这个是用来添加动态库的)
  3. Embed Without Signing (这个也是用来添加动态库的,一般不用)

根据framework的类型不同,选择相应的Embed方式即可。如果选错了,你会看到 Found an unexpected Mach-O header code: 0x72613c21错误