Xcode创建静态库

前言

随着项目功能的扩展,开发人员增多,代码越来越庞大,导致代码混乱、编译变慢等一系列问题。可以尝试采用静态库的方式,每个人负责的模块独立编译成静态库,最后再引入到项目中去。当然如果写的代码需要保密,不想给其他人看到,或者自己写的工具类不同的项目中都需要用的话,静态库也是不错的办法。

基本概念
  1. 静态库
    存在.a和.framework两种形式。
    .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
    简单可以这么说,.a + .h + sourceFile = .framework,所以创建静态库最好还是用.framework的形式。
  2. 动态库
    存在.framework和.tbd两种形式。
  3. 静态库和动态库的区别
    静态库在编译链接时, 会被完整的赋值到可执行文件中;动态库在程序运行时动态加载到内存中, 系统只会加载一次。
  4. 架构
    查看静态库对应的构架: lipo -info Xxx.a
    模拟器架构有i386、x86_64
    真机架构有armv7、armv7s、arm64
创建静态库项目
  1. Xcode -> File -> New -> Project... -> 选择Cocoa Touch Framework


    创建静态库工程.png

    Cocoa Touch Framework编译生成.framework文件。
    Cocoa Touch Static Library编译生成.a文件。

  2. 修改Target的Build Settings
    Build Active Architecture Only改成No


    image.png

    Dead Code stripping改成No
    Link With Standard Libraries改成No
    Mach-O Type改成Static Library


    image.png
  3. 在Build Phases的Headers中公开.h文件


    image.png

    4.编译


    image.png

    编译生成的.framework文件可以用lipo -info xxxSDK.framework/xxxSDK查看支持的架构,可以用lipo -create 命令合并.framework。用lipo命令不是很方便,下面通过添加一个target运行脚本的方式导出静态库。
    5.导出静态库

    选中TARGETS下面的xxxSDK,Editor -> Add Target...


    image.png

    选择Cross-platform,选择Other下面的Aggregate -> Next
    image.png

    选中TARGETS下面新生成的xxxSDKRun,切换到Build Phases面板,点击 + ,点击弹出的New Run Script Phase
    image.png

    在新生成的Run Script的Shell下加入以下运行脚本
    image.png

    运行脚本
#!/bin/sh
#要build的target名
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}_Products/"

#创建输出目录,并删除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"

#分别编译模拟器和真机的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

#拷贝framework到univer目录
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"

#合并framework,输出最终的framework到build目录
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"

#删除编译之后生成的无关的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done

#判断build文件夹是否存在,存在则删除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi

rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"

#打开合并后的文件夹
open "${UNIVERSAL_OUTPUT_FOLDER}"

Scheme选择xxxSDKRun,Build即可生成最终使用的.framework文件。(一定要先选中xxxSDK,Build成功之后才行)


image.png
后记
  1. 在要使用.framework的项目中拖入.framework文件即可,import .h文件时,需要以#import <xxxSDK/Utils.h>这样的形式导入。
  2. 如果静态库需要引入第三方库,可以使用pod的形式,第三方库不会打包进.framework中,避免重复引用。
    3.如果静态库需要用到图片等资源文件,可以导入bundle。
  3. .h文件比较多的时候,可以把.h文件统一引入到一个.h文件中,在项目中只引入这个.h文件即可。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容

  • 知识点 字体综合设计font属性用于对字体样样式进行综合设置,其基本语法格式如下:选择器{font:font-st...
    睡到自然醒_52阅读 431评论 1 1
  • 今日内容 1.文件的上传与下载 1.0文件上传: 在web开发中一般会有文件上传的操作 一般JavaWeb开发中文...
    lookeverybody个鸡阅读 298评论 0 0
  • 秋: 敢于做事,敢于担当,要走到前头,坚持原则,敢于亮剑,做好亮剑,亮好剑。 法务如何开展 ①拿出成绩,成果,前后...
    nikitakz阅读 171评论 0 0
  • 柯维认为人的成长历程虽是渐进的,效果却是革命性的。前三个有关个人成功的习惯,可以大幅度提高你的自信。你将更能认清自...
    寒烟冷月阅读 320评论 0 5
  • 虽然已经过了对工作挑挑拣拣的年纪,但任然不安分的我最近比较忙。曾经那些叫我阿姨姐姐(我为了显自己年轻,总让他们叫我...
    张婧L阅读 366评论 0 1