zoukankan      html  css  js  c++  java
  • 静态库 动态库

    1,存在形式

    静态库: .a 和 .framework;

    动态库: .dylib 和 .framework;

    2. 使用

    静态库: 链接时,静态库会完整的复制到可执行文件中,被多次使用就会用多份冗余拷贝; -- (核心代码,将MRC打包成静态库,避免切换开发环境)

    动态库: 链接时,不复制,程序运行时 由系统动态加载到内存, 供程序调用.

    [注意]: 静态库并不会将资源打包, 如果静态库中用到了其他的资源,必须手动导入.(一般将资源放入到.bundle文件中)

    3. 报错

    Undefined symbols for architecture i386:

      "_OBJC_CLASS_$_GLTools", referenced from:

          objc-class-ref in ViewController.o

    ld: symbol(s) not found for architecture i386

    clang: error: linker command failed with exit code 1 (use -v to see invocation)

     静态库 - 错误

    /*

    a. Build Phases ----  Add <StaticLibName> to your targets “Target Dependencies” section ---- Add lib<staticLibName>.a to the “Link Binary With Libraries” section.

    b. Select “Build Settings”. -----  Header Search Paths and add an entry consisting of include/

    c. Make sure -all_load -ObjC is added to the Other Linker Flags section.

     -ObjC这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。但是如果静态库中有类和category的话只有加入这个flag才行。

     -all_load这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。-force_load在xcode3.2后可用。但是-force_load后面必须跟一个只想静态库的路径。

     */

    01. 为什么要做静态库

    ================================================================================

    1>  国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用

    例如:百度地图,友盟,JPush等

    2>  在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,也会提供静态库给程序员使用

    02. 静态库的特点

    ================================================================================

    .a + .h

    03. 静态库简单演练

    ================================================================================

    1>  新建CZTools项目

    2>  创建一个类方法,实现一个简单的加法

    3>  编译

    #   注意,在编译静态库时,需要编译两个版本 -> 真机(arm) | 模拟器(i386)

    4>  新建项目将编译生成的.a + .h拖到项目中使用

    04. 静态库中的资源包的使用

    ================================================================================

    问题:有些第三方库会使用到一些图片素材,例如公司的logo等。

    但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。

    在静态库中如果要使用图片素材,会利用bundle的手段

    1>  建立bundle,并且向其中添加图片

    2>  创建一个类方法,返回图片

    3>  编译

    4>  调用方如果需要使用,需要导入 .h + .a + XXX.bundle

    05. 静态库中的自定义视图

    ================================================================================

    问题:程序需要测试

    静态库如何测试呢?

    创建复合项目

    1>  复习块代码传值

     06. 静态库的使用

     新建项目将编译生成的.a + .h拖到项目中使用

    07. 静态库的种类

    静态库文件的版本(4种)

    1.真机-Debug版本

    2.真机-Release版本

    3.模拟器-Debug版本

    4.模拟器-Release版本

    调试版本 VS 发布版本

    --------------------------------------------------------------------------------

    - 调试版本会包含完整的符号信息,以方便调试

    - 调试版本不会对代码进行优化

    - 发布版本不会包含完整的符号信息

    - 发布版本的执行代码是进行过优化的

    - 发布版本的大小会比调试版本的略小

    - 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升

    08. 静态库的合并

    # 检测.a的类型

    $ lipo -info libCZTools.a

     # 合并.a

    lipo -create Debug-iphoneos/libCZTools.a Debug-iphonesimulator/libCZTools.a -output libCZTools.a

    # 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试

    # 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的

    # 今后在使用.a时一定注意版本

    建议发布的时候,使用真机的静态库.

  • 相关阅读:
    浅谈数据分析中的“暗物质”
    浅谈数据分析中的“暗物质”
    房屋价格数据采集与分析
    房屋价格数据采集与分析
    基于Python对象引用、可变性和垃圾回收详解
    基于Python对象引用、可变性和垃圾回收详解
    人脸识别中常用的几种分类器
    人脸识别中常用的几种分类器
    解析新零售,互联网大数据时代的到来
    osg::NodeVisitor中计算一个节点对应的世界变换矩阵、法向量、顶点坐标
  • 原文地址:https://www.cnblogs.com/guangleijia/p/4759116.html
Copyright © 2011-2022 走看看