万能的静态库

公司给我安排了一个任务要写一个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

你可能感兴趣的:(万能的静态库)