美文网首页
Xcode创建静态库

Xcode创建静态库

作者: 少东_SH | 来源:发表于2019-07-11 21:31 被阅读0次
前言

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

基本概念
  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文件即可。

相关文章

  • iOS 最全动态库/静态库制作 Framework/.a

    一、静态库 1.创建静态库工程 Xcode -> Create a new Xcode project -> iO...

  • xcode创建静态库和framework

    xcode创建静态库和framework创建framework 另外:附上frameWork制作通用动态库脚本

  • xcode13创建静态库,无products文件夹问题

    xcode12开始创建静态库就已经有所改变,前段时间用xcode13创建.a静态库,更是连products文件夹都...

  • framework制作

    .a静态库的创建 先创建一个XCode工程,选择Static Library。 编辑添加静态库代码,示例如下,一个...

  • Xcode创建静态库

    前言 随着项目功能的扩展,开发人员增多,代码越来越庞大,导致代码混乱、编译变慢等一系列问题。可以尝试采用静态库的方...

  • Unity调用Objective-c带有Callback的静态库

    Xcode部分 1 创建静态库 需要将.m文件重命名为.mm 2 build生成静态库.a文件 Unity部分 ...

  • Xcode7.3中构建静态库

    创建静态库 Xcode中编译静态库其实非常简单,就是新建一个静态库类型的项目,如图中所示。 但是这篇文章把这个简单...

  • IOS如何简单的生成.a静态库

    1、创建静态库项目,使用Xcode中”New”—“Project”,弹出如下提示框选择静态库,再进行下一步。 2、...

  • iOS Xcode创建静态库

    一、静态库和动态库的区别 静态库:1.模块化,分工合作。2.避免少量改动经常导致大量的重复编译链接。3.也可以重用...

  • Xcode创建.framework静态库

    最近项目中的登录和支付模块,需要封装成静态库,做下记录及踩的坑。 库介绍 库是共享程序代码的方式 库从本质上来说是...

网友评论

      本文标题:Xcode创建静态库

      本文链接:https://www.haomeiwen.com/subject/tjpjkctx.html