iOS 静态库开发

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

内容简介:本文旨在说明静态库制作中的一些常见问题和特殊处理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 静态库开发》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

最优化导论

最优化导论

Edwin K. P. Chong、Stanislaw H. Zak / 孙志强、白圣建、郑永斌、刘伟 / 电子工业出版社 / 2015-10 / 89.00

本书是一本关于最优化技术的入门教材,全书共分为四部分。第一部分是预备知识。第二部分主要介绍无约束的优化问题,并介绍线性方程的求解方法、神经网络方法和全局搜索方法。第三部分介绍线性优化问题,包括线性优化问题的模型、单纯形法、对偶理论以及一些非单纯形法,简单介绍了整数线性优化问题。第四部分介绍有约束非线性优化问题,包括纯等式约束下和不等式约束下的优化问题的最优性条件、凸优化问题、有约束非线性优化问题的......一起来看看 《最优化导论》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具