美文网首页
cocopods里的Podfile相关内容

cocopods里的Podfile相关内容

作者: 写代码的小农民 | 来源:发表于2021-02-24 18:57 被阅读0次

    use_frameworks!的作用、静态库与动态库、tbd

    首先明确一下几个概念


    20180911233237361.png

    从iOS8/Xcode6开始,苹果允许使用动态库链接
    通过cocoapods管理应用程序时,在Podfile文件中,use_frameworks!的使用区别如下:

    2018091123524777.jpg
    • 使用use_frameworks!dynamic frameworks 方式 -> .framework
    2018091123530750.jpg
    cocoapods会生成对应的 frameworks 文件
    在Link Binary With Libraries:会生成Pods_工程名.framework,包含了其它用cocoapods导入的第三方框架的.framework文件
    
    • 不使用use_frameworks!static libraries 方式 -> 生成.a文件
    cocoapods会生成相应的 .a文件(静态链接库)
    Link Binary With Libraries: libPods-工程名.a 包含了其他用cocoapods导入有第三库的 .a 文件
    
    这里写图片描述

    系统提供的库都是 dylib 动态库

    什么是 tbd?“text-based stud libraries”的缩写,Xcode7开始引入的技术,为了减少Xcode中相应的SDK的体积,实际上是一个文本。

    --- !tapi-tbd-v3
    archs:           [ armv7, armv7s, arm64 ]
    uuids:           [ 'armv7: DEA2F438-8531-392F-85B1-73240DD2A2EC', 'armv7s: A50A77BF-6473-3BBB-B0D1-92E3240D79DC', 
                       'arm64: E53F9393-BFC8-3EF5-8520-B0FE6B193183' ]
    platform:        ios
    install-name:    /System/Library/Frameworks/Foundation.framework/Foundation
    current-version: 1452.23
    compatibility-version: 300
    objc-constraint: none
    exports:         
      - archs:           [ armv7, armv7s ]
        symbols:         [ '$ld$add$os2.0$_OBJC_CLASS_$_NSURL', '$ld$add$os2.0$_OBJC_METACLASS_$_NSURL', 
                           '$ld$add$os2.1$_OBJC_CLASS_$_NSURL',  
    
    

    其中有支持的架构、二进制文件的位置以及库中所有 symbols 的声明,是动态库的一个描述。

    Xcode动态库的路径:
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks

    Foundation.framework也是一个dylib动态库,可以看到目录下有同名的tbd以及Headers(包含开发的API头文件)


    20181116115007583.png

    动态库是在程序运行的时候才加载的,在Xcode中导入这些 framework 以及tbd只是对动态库的一个描述,目前是为了告诉编译器动态库中有这些API,以便于成功编译,否则编译不通过,提示 “Symbol not found” 错误。

    在Foundation.framework的tbd文件中,可以看到其动态库的存放路径在“/System/Library/Frameworks/Foundation.framework/Foundation”,但实际上在越狱设备上并不能找到对应的文件,其他的库也是一样。
    在iOS系统中,系统库文件都被打包到一个缓存的文件中,即 dyld 缓存,位于/System/Library/Caches/com.apple.dyld/目录下,文件名是以“dyld_shared_cache_”开头,再加上这个动态库 dyld支持的指令集。

    use_frameworks告诉CocoaPods你想使用Frameworks而不是Static Libraries。由于Swift不支持静态库,你必须使用框架。

    静态库和框架之间的区别:

    Cocoa Touch Frameworks
    它们始终是开源的,并且将像应用一样构建。(所以Xcode有时候会编译它,当你运行你的应用程序,并且总是在你清理完项目之后。)框架只支持iOS 8和更新的版本,但是你可以在框架中使用Swift和Objective-C。
    Cocoa Touch Static Libraries
    它们是静态的。所以当你将它们导入你的项目时,它们已经被编译。可以与他人分享,而不必向他们展示代码。请注意,静态库目前不支持Swift。不得不在库中使用Objective-C。应用程序本身仍然可以用Swift编写

    相关文章

      网友评论

          本文标题:cocopods里的Podfile相关内容

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