iOS 静态库开发

本文旨在说明静态库制作中的一些常见问题和特殊处理
1. 打包静态库需要的相关问题和设置

  • 静态库中用到分类的需要在项目中设置这个参数:Other Linker Flags-ObjC或者-all_load
  • 静态库中用到了NSClassFromString或者runtimeobjc_getClass,但是转换出来的Class 一直为nil。解决方法:在主工程的Other Linker Flags需要添加参数-ObjC即可
  • 如果Xcode找不到框架的头文件,可能是忘记将它们声明为public
  • Base SDK指的是当前编译所用的SDK 版本,一般默认为当前xocde的最新版
  • Build Active Architecture Only设置成No
  • Deployment Target它控制着运行应用需要的最低操作系统版本
  • Skip Install设置为Yes
  • Mach-O Type静态库设置为Static Library,动态库设置为Dynamic Library,制作bundle文件设置为Bundle
  • 静态库中最好不要用xib,要用的话就将xib放到bundle文件中编译,然后xib就会变成.nib的文件
  • 如果开发的静态库里面有C或者C++,在使用的时候需要添加libc++.tbd或者libstdc++.tbd
  • 关于C语言中Implicit declaration of function ‘XXXX’ is invalid in C99警告:C语言是过程化的编程语言,程序执行顺序是从上到下。如果在调用某函数的时候,函数在调用之前没有定义也没有声明,而是在调用之后定义,那么编译时Implicit declaration of function ‘XXXX’ is invalid in C99警告就产生了。这是有别于面向对象编程语言的地方

2. framework中Optional和Required的区别

  • Required:强引用,一定会被加载到内存中,即使不使用也会被加载到内存中
  • Optional:弱引用,开始并不会加载,在使用的时候才会加载,会节省加载时的时间。有一些库,如Social.frameworkAdSupport.framework,是在iOS 6之后才被引入的,更新了一些新的特性,如果运行在5.0甚至更低的设备上,这些库不支持,会编译通不过,这时候就要使用弱引用了
  • 当你遇到了dyld:Library not found ……说明你可能使用了不该有的强引用,根据日志将这个库的引用形式修改一下;或者是使用了动态库,就需要在Embeded Binaries选项中添加这个动态库

3. 如何看一个framework中的二进制文件是静态库还是动态库

  • 使用file命令,如:$ file /Users/yostar/Desktop/ProjectTest/YostarSDK/ThirdPath/TwitterKit.framework/TwitterKit;见下面的截图,一个是静态库,一个是动态库

4. 查看静态库是否支持bitcode
$ otool -l /Users/yostar/Desktop/UnityLib/libYostarSDK.a | grep __LLVM
如果上述命令的输出结果有__LLVM,那么就说明,所用的framework.a支持设置Enable bitcodeYES,否则不支持

5. 静态库相关操作

  • 查看一个库文件支持的指令集:
    1
    2
    $ lipo -info ./XXXX.a
    $ lipo -info ./XXXX.framework/XXXX
  • 合成指令集:
    1
    2
    $ lipo -create XXXX_iphoneos.a XXXX_iphonesimulator.a -output XXXX_all.a
    $ lipo -create XXXX_iphoneos.framework/XXXX_iphoneos XXXX_iphonesimulator.framework/XXXX_iphonesimulator -output XXXX_all
  • 拆分特定指令集:
    1
    2
    $ lipo -thin libname.a armv7(CPU架构名称) -output libname-armv7.a
    $ lipo -thin XXXX.framework/XXXX arm64 -output XXXX.framework/XXXX-arm64
  • 注意framework和.a处理不同,.a可以直接使用,framework需要做替换处理;framework合并或者拆分完成后,再把输出的文件替换上面simulator文件夹或者iphoneos对应目录下的framework文件

6. 打包framework之嵌套另一静态库产生类文件重复问题
将打包好的framework和第三方静态库引入项目,运行,产生两个静态库文件类名重复的问题。如下:

这就说明在封装framework时将第三方静态库中的文件给引入了,从而造成两个库中有多个相同类名文件。


这样编译生成的framework就不会和引入的静态库有相同的类文件了

7. 打包 C,C++文件及和OC混编,接口代码

  • 静态库打包C代码
    xcode新建文件YostarUtilits.hYostarUtilits.m,例子如下:
    1
    2
    3
    4
    5
    6
    7
    #import <Foundation/Foundation.h>

    const char * getIDFA();

    @interface YostarUtilits : NSObject

    @end
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #import "YostarUtilits.h"

    const char * getIDFA(){
    NSString *str = @"123";
    const char *strC = [IDFAStr UTF8String];

    char *result = (char *)calloc(10, sizeof(char *));
    if (result) {
    strcpy(result, strC);
    }
    return result;
    }

    @implementation YostarUtilits

    @end
  • 静态类库打包C++代码
    xcode新建文件YostarUtilits.hYostarUtilits.mm,例子如下:
    1
    2
    3
    4
    5
    #import <Foundation/Foundation.h>

    @interface YostarUtilits : NSObject

    @end
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #import "YostarUtilits.h"

    #if defined(__cplusplus)
    extern "C"
    {
    #endif

    const char * getIDFA(){
    NSString *str = @"123";
    const char *strC = [IDFAStr UTF8String];

    char *result = (char *)calloc(10, sizeof(char *));
    if (result) {
    strcpy(result, strC);
    }
    return result;
    }

    #if defined(__cplusplus)
    }
    #endif

    @implementation YostarUtilits

    @end
-------------本文结束感谢您的阅读-------------
最近的文章

iOS 模态跳转推出透明背景方法

1. OS &gt;= iOS 8.0123FZLoginViewController *fzLoginViewController &#x3D; [[FZLoginViewController alloc] init];fzLoginViewController.modalPresentation …

继续阅读
更早的文章

iOS tableViewCell相关设置

1. 去掉底部多余的表格线1[tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];2. 在自定义tableViewCell中设置分割线 顶头显示 self代表cell1234567891011if ([sel …

继续阅读