iOS 静态库开发

栏目: IOS · 发布时间: 5年前

内容简介:本文旨在说明静态库制作中的一些常见问题和特殊处理4. 查看静态库是否支持bitcode6. 打包framework之嵌套另一静态库产生类文件重复问题将打包好的framework和第三方静态库引入项目,运行,产生两个静态库文件类名重复的问题。如下:

本文旨在说明静态库制作中的一些常见问题和特殊处理 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 ;见下面的截图,一个是静态库,一个是动态库
    iOS 静态库开发

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

5. 静态库相关操作

  • 查看一个库文件支持的指令集:
$ lipo -info ./XXXX.a
$ lipo -info ./XXXX.framework/XXXX
复制代码
  • 合成指令集:
$ 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
复制代码
  • 拆分特定指令集:
$ 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和第三方静态库引入项目,运行,产生两个静态库文件类名重复的问题。如下:

iOS 静态库开发

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

iOS 静态库开发
iOS 静态库开发

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

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

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

const char * getIDFA();

@interface YostarUtilits : NSObject

@end
复制代码
#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 ,例子如下:
#import <Foundation/Foundation.h>

@interface YostarUtilits : NSObject

@end
复制代码
#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 静态库开发》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spark SQL内核剖析

Spark SQL内核剖析

朱锋、张韶全、黄明 / 电子工业出版社 / 2018-8 / 69.00元

Spark SQL 是 Spark 技术体系中较有影响力的应用(Killer application),也是 SQL-on-Hadoop 解决方案 中举足轻重的产品。《Spark SQL内核剖析》由 11 章构成,从源码层面深入介绍 Spark SQL 内部实现机制,以及在实际业务场 景中的开发实践,其中包括 SQL 编译实现、逻辑计划的生成与优化、物理计划的生成与优化、Aggregation 算......一起来看看 《Spark SQL内核剖析》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具