静态库SDK—— .framework和.a的制作

本文介绍了iOS开发中库的相关知识,包括.dylib库与.tdb库等价,自建.framework为静态库、系统的为动态库,以及.a与.framework的区别。详细说明了生成.framework的步骤,如创建工程、关联第三方库、配置框架等,还提及合并模拟器和真机包的方法,最后介绍了.a库的打包和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.库的介绍

强调几点:

 第一  (.dylib库文件) == (.tdb库文件)

第二. 自己建立的.framework是静态库,而系统的.framework是动态库

第三. .a文件和.framework文件的区别:

          区别一: .a是一个纯二进制文件,.framework中除了有二进制文件之外还有很多资源文件

          区别二: .a不能直接使用,至少要有.h文件配合,.framework文件可以直接使用

          区别三:  .framework == .a + .h + sourceFile

 

二. 生成.framework

1、先创建Cocoa Touch Framework工程

2、然后cd到工程目录,pod init,pod install,关闭工程,打开xcworkspace文件

3、添加Single View APP 类型的target,作为一个测试联调的demo

4、编写好demo,编译成功后,把Framework关联到Single View APP 类型的target中

5、demo中调入头文件,假如出现找不到头文件警告,就在setting配置中,添加$SRCROOT (recursive递归遍历选项)

创建framework

1、在Xcode中创建一个framework工程,如下图所示

创建Framework类型

成功后截图:

 

2、使用Pod工具,创建并依赖第三方库,如下图所示

pod 命令操作后

 

2.1、pod install ,关闭原来工程,打开xcworkspace后。

CocoaPods引入第三方库,import提示file not found

选择工程Target --> BuildSettings --> search Paths 下的 User Header Search Paths --> 双击空白,点击“+”号添加一项:并且输入:“$(PODS_ROOT)”(没有引号),选择:recursive。

 

 

2.2、添加第三方依赖,实际情况会经常遇到

 

2.3、添加自定义类

 

 

 

另外,头文件需要这样方式<xxx/xxx.h>加载

 

SDK内部的依赖头,"xxx.h"导入就行了

 

 

3、代码编写好之后,接下来,就需要配置Framework

1、设置静态库类型和其他的一些设置

dead code stripping 去除被定义但未被调用的代码

 

2、暴露头文件

 

3、假如没有armv7s,就添加,另外设置Build Active Architecture Only 为NO

 

4、Framework关联Demo,联调开发

1、在工程中添加一个 Single View APP类型的TARGETS,我工程中命名为demoSample,如下图所示

操作步骤:选择TARGETS选项,点击底部+按钮,弹出选择TARGETS类型界面后,选择 Single View APP类型,创建就行.

成功后:

 

2、现在把demo工程创建好了,接下里就需要Framework关联Demo了 

先编译Framework,然后得到Framework文件

切换target回到DemoSample工程中

注意⚠️:假如出现了自定义Framework找不到头文件的话,

就在setting配置中,添加$SRCROOT (recursive递归遍历选项)

提示:然后,有事没事就记得clean一下工程,特别有时候弄Cocoapod制作时,不clean一下,一直出找不到头文件啥的

 

 

接下来,就看看怎么打包合并模拟器和真机设备的包了(重要)

5、合并模拟器Framework包与真机Framework包

⚠️⚠️注意事项:一点要先在模拟器编译成功,另外也需要在设备编译成功,确保得到两个包才可以操作合并,不然合并的出来的Framework包为空包,Header里面什么都没有

5.1、生成一个类型为Aggregate类型的TARGETS

 

点击左上角+号,添加一个脚本,利用脚本合并Framework包

 

###############

###################

#######################

 

#!/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}"

 

########################

###################

###############

##########

 

 

5.2、选择上面创建的Aggregate类型的Target进行编译,成功后,就弹出一个Framework了

注意:确保真机的包和模拟器的包都存在,不然得到的是空包。

 

 

 

 

 

 

=======打包.a=======

1.新建工程

 

2.配置参数

 

 

3.创建bundle文件,名字一般与工程名相同(如果静态库有资源文件要使用,必须放入.bundle文件)

 

4.准备工作已经完成,准备写代码

5.打包.a文件

选中模拟器, command + b

选中真机,command + b

 

合成:(如下只给合成的界面,具体不懂得可以看.framework中合成的步骤)

 

6. 使用.a的SDK

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值