iOS制作静态库(framework, .a, bundle)

简介:

  • 程序编译通常会经过预处理,编译,汇编,链接。静态库的特点是可执行文件中包含了库代码的完整copy,缺点是如果多次用到会多次copy
  • 静态库是在链接阶段被复制到了程序中和运行时无关
  • 动态库是在运行时由系统动态加载到内存中,只会加载一次
  • 可以制作静态库分为.a库和.framework库
  • .a是一个二进制文件不能直接使用至少要加上.h文件;.framework不仅有二进制文件还有资源文件; .a + .h + sourcefile = .framework
  • .framework库默认时动态库,但是开发者只能制作.framework形式的静态库

资源文件处理:

  1. 资源文件中不含xib文件,只有图片,pilist文件等。可以直接将资源文件放入同一个文件夹,然后将文件夹的后缀改为.bundle,直接使用即可。
  2. 含有xib文件。
  • bundle指含有可执行的代码及代码所需的资源,以特定标准的层次结构组合起来的文件夹。“可执行”即经过编译后可直接执行的程序代码
  • xib文件在编译之后会变成nib文件。xib文件是XML文件,方便diff比较,进行版本控制;nib是一个二进制文件;bundle中应该是nib形式的文件
  • 将xib文件转换成nib文件
    • 生成bundle替换
  1. 在framework中使用该bundle时:
    /// 获取framework所在的沙盒即主bundle。
    NSBundle *mainBundle = [NSBundle bundleForClass:[self class]];
    /// 获取需要使用到的bundle,即资源所在的bundle。 'FF0622Bundle'为制作的bundle
    NSBundle *needBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"FF0622Bundle" ofType:@"bundle"]];
    /// 加载需要的图片
    UIImage *image = [UIImage imageWithContentsOfFile:[[needBundle resourcePath] stringByAppendingPathComponent:@"222.jpg"]]
  1. 制作bundle
    • 脚本转换不方便:
 ibtool --errors --warnings --output-format human-readable-text --compile xxx(要生成的nib文件路径) xxx(要转换的xib文件的路径)

制作静态库时设计的lipo命令:

  1. man xcodebuild 查看xcodebuild简介
  2. xcdoebuild -showsdks 查看支持的sdk如iphoneos iphonesimulator
  3. xcdoebuild -showBuildSettings 查看默认的配置信息,需要cd到项目目录下。可以看到BUILD_DIR BUILD_ROOT等信息
  4. xcodebuild -target xxx -configuration Release -sdk iphoneos clean build BUILD_DIR=XXX BUILD_ROOT=XXX VALID_ARCHS="arm64 armv7" 在指定位置build真机架构
  5. xcodebuild -target xxx -configuration Release -sdk iphonesimulator clean build BUILD_DIR=XXX BUILD_ROOT=XXX VALID_ARCHS="x86_64 i386" 在指定位置build模拟器架构
  6. lipo -info xxx 查看支持的架构
  7. lipo -create xxx xxx -output xxx 合并架构并输出到指定位置
  8. lipo -remove i386 xxx -output xxx 移除i386架构并将剩余的架构输出到指定位置
  9. lipo -thin arm64 xxx -output xxx 抽离出arm64架构并输出到指定位置

制作framework静态库

framework静态库

制作.a静态库

.a静态库

posted @ 2022-06-27 18:31  jisa  阅读(487)  评论(0编辑  收藏  举报