公司给我安排了一个任务要写一个SDK。之前虽然研究过,但从来没有真正写过。曾经研究的东西也记的七零八落,所以翻出了以前的学习笔记也从网上找了一些资料,整理出一些静态库相关的东西。有准备写SDK的同学可以看看,本文内容易上手。
#pragma mark - 一. 静态库
#pragma mark 1. 创建.a静态库
1. 创建应该选择Framework一栏 --> static
2. 默认编译后(真机/模拟器分别运行)只会输入, 自带的.h, 不会输出新建类的.h
3. 应该选择项目--> Build Phases --> Copy file --> 添加.h即可
#pragma mark 2. 测试.a静态库
1. 模拟器的架构问题
1>. 常见报错: Undefined symbols for architecture arm64 / i386 /armv7s/ armv7
//architecture: 架构
解决方式: 检查静态库的架构问题 看看是否模拟器和真机导入错误
2>. 模拟器和真机的架构
//模拟器编译时只输出一种架构
//真机(不要插入iPhone),默认输出多种架构, 除了armv7s
//从2014年10月的某个版本更新中, 取消了armv7s为默认输出选项
//架构是支持低版本兼容
模拟器:2种架构
i386 :4S ~ 5 --> 32
x86_64 :5S ~ 6s --> 64
真机: 3种架构
armv7 :4 ~ 4s
armv7s :5 ~ 5c
arm64 :5S ~ 6s
2. 查看静态库支持的架构
cd到静态库目录下
查看架构: lipo -info lib.a
3. 架构的合成
方式一: 命令行, 两两合并 (真机不插iPhone, 默认已经多个架构 --> 模拟器合成一次, 再跟真机合成一次)
lipo -create 真机路径 模拟器路径 -output 指定路径
方式二: 更改编译参数
点击库文件 --> Target --> Build Setting --> 只编译当前架构选项改为NO
如果是模拟器编译, 则直接编译成2个版本之和
如果是真机编译,仍然编译成2个版本之和
还需要跟真机合并一次
4. 合成静态库的优缺点
如何合成: 比如友盟 优点: 调试方便 缺点: 体积大
如果不合成: 比如百度2.8.1版本 优点:减少文件体积 缺点: 真机和模拟器切换调试非常不方便
*如何打包出armv7s架构
可以进入Build Setting --> 手动添加三个架构, 然后编译即可
5. Release和Debug模式的区别
Debug: 调试状态 NSLog 拥有丰富的调试代码, 用户不需要加载这些代码
Release: 发布状态 系统会在打包时取出一些调试代码, 文件体积变小, 运行速度变快(用户不会感受到明显的感觉)
最好发布Release版本
#pragma mark 3. 添加资源文件
一定要方法到bundle文件夹下, 保证路径加载是唯一的资源. 否则可能会跟项目里的同名文件发生冲突, 导致文件加载出错.
#pragma mark 4. 边开发边调试.a静态库
1. 创建普通的项目
2. 添加项目Target, 创建库文件, 并实现相关方法
3. 在项目中手动导入.a文件 (重要)
4. 此时.a是通用文件, 什么架构都可以使用.
5. 如果想导出静态库文件, 那么切换Target, 按照之前提到的步骤输出即可.
#pragma mark 5. 创建Framework静态库
1. 头文件跟.a一样, 默认只输出创建项目时自带的.h
2. 如果要导出头文件, 找项目--> Build Phases --> Headers --> 将Project的头文件拖拽到Public中即可
3. 其他的架构编译方式跟.a一样
4. Framework的形式 默认导出是动态库 (.dylib / Xcode7 .tbd) . 找到项目--> Embedded Binaries 添加Framework即可.
5. 动态库不能上架, 需要转换静态库 : --> Build Setting --> 搜索mach --> 修改成静态库即可
#pragma mark 6. 测试Framework静态库
1. 一定要注意头文件的导出 . 头文件如果敲不出来, 强制敲
2. 如果需要导出, 参考上面的导出方式即可(注意转换动态库)
还有另一种合并framework的方法:
在项目的Build Phases中,新建一个Run Script,输入下面内容:
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers"
"${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}"
"${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
#open "${SRCROOT}/Products"
fi
当项目再次Build时,就会在项目目录下面出现Products目录,里面包含了合并后的Framework文件夹。
参考链接:http://blog.csdn.net/shtlovexx/article/details/51538751