zoukankan      html  css  js  c++  java
  • iOS 基于XCode12 脚本封装静态链接库文件 .a

    1. 创建工程 勾线 iOS -> Static Library 命名 first 

    2. 工程里自动生成的first.h first.m 文件 手动删除  添加新的自己的打包文件:

         这里添加HFTest.h,HFTest.m

    3. Target Build Setting  里搜索  Excluded Architectures,

        设置Release 为 Any iOS Simulator SDK:arm64 目的:为模拟器去掉架构arm64

       原因:Xcode12之前:编译模拟器静态库支持i386  x86_64两架构;编译真机静态库支持armv7 arm64两架构。现在Xcode12编译的模拟器静态库也支持了arm64,导致出现真机库和模拟器库不能合并的问题。

       会报错“fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /Users/song/Documents/LiSourse/2021Demo/Second/Build/Release-iphoneos/libSecond.a and /Users/song/Documents/LiSourse/2021Demo/Second/Build/Release-iphonesimulator/libSecond.a have the same architectures (arm64) and can't be in the same fat output file” ⚠️ 

    4. 露出指定的头文件,这里是HFTest.h

       Target->Build Phases -> Copy Files-> 添加HFTest.h 文件

    5. 创建脚本, 运行脚本即可

        脚本功能 代替了 手动切换 release 环境 手动 编译 并合并 release 环境下 真机静态链接库文件libfirst.a和模拟器libfirst.a 的过程

        实现了 在release 环境下 自动编译build  并合并出libfirst.a 

         添加脚本Script.sh ⚠️脚本目录和xxxx.xcodeproj要在同一个目录 

       在脚本同级目录运行脚本即可 :

       sh Script.sh

       

    #!/bin/sh
    
    #  Script.sh
    #  Second
    #
    #  Created by HF on 2021/7/9.
    #  
     
    #注意:脚本目录和xxxx.xcodeproj要在同一个目录,如果放到其他目录,请自行修改脚本。
    #要build的target名
     
    #要build的target名
    target_Name=Second
    echo "target_Name=${target_Name}"
     
    #工程名
    project_name=$target_Name
    echo "project_name=${project_name}"
    
    #打包模式 Debug/Release 默认是Release
    development_mode=Release
    
    
    #当前脚本文件所在的路径 $(pwd)
    SCRIPT_DIR=$(pwd)
    echo "======脚本路径=${SCRIPT_DIR}======"
    
    #工程路径
    #PROJECT_DIR=${SCRIPT_DIR} 和下面写法也样
    PROJECT_DIR=$SCRIPT_DIR
    echo "======工程路径=${PROJECT_DIR}======"
    
    #build之后的文件夹路径
    build_DIR=$SCRIPT_DIR/Build
    echo "======Build路径=${build_DIR}======"
    
    #真机build生成的头文件的文件夹路径
    DEVICE_DIR_INCLUDE=${build_DIR}/${development_mode}-iphoneos/include/${project_name}
    
    
    
    #真机build生成的.a文件路径
    DEVICE_DIR_A=${build_DIR}/${development_mode}-iphoneos/lib${project_name}.a
    echo "======真机.a路径=${DEVICE_DIR_A}======"
    
    #模拟器build生成的.a文件路径
    SIMULATOR_DIR_A=${build_DIR}/${development_mode}-iphonesimulator/lib${project_name}.a
    echo "======模拟器.a路径=${SIMULATOR_DIR_A}======"
    
    
    #目标文件夹路径(也就SDK的文件:.a文件 和 头文件)
    INSTALL_DIR=${build_DIR}/Products/${project_name}
    echo "======SDK的文件夹路径=${INSTALL_DIR}======"
    
    #目标头文件的文件夹路径
    INSTALL_DIR_Headers=${build_DIR}/Products/${project_name}/Headers
    echo "======头文件的文件夹路径=${INSTALL_DIR}======"
    
    #目标.a路径
    INSTALL_DIR_A=${build_DIR}/Products/${project_name}/lib${project_name}.a
    echo "======目标.a路径=${INSTALL_DIR}======"
    
    
    #判断build文件夹是否存在,存在则删除
    #rm -rf 命令的功能:删除一个目录中的一个或多个文件或目录
    if [ -d "${build_DIR}" ]
    then
    rm -rf "${build_DIR}"
    fi
    
    
    #判断目标文件夹是否存在,存在则删除该文件夹
    if [ -d "${INSTALL_DIR}" ]
    then
    rm -rf "${INSTALL_DIR}"
    fi
    
    #创建目标文件夹
    mkdir -p "${INSTALL_DIR}"
    
    
    
    echo "======盒子已经准备好了,开始生产.a 并合成装到盒子里吧======"
    
    #build之前clean一下
    xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphonesimulator clean
    
    xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphoneos clean
    
    #模拟器build
    xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphonesimulator
    
    #真机build
    xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphoneos
    
    
    #复制头文件到目标文件夹
    #使用-R参数可实现递归功能,即所有子目录中的文件与目录均拷贝
    cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"
    
    
    #合成模拟器和真机.a包
    lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"
    
    echo "======合成结束======"
    
    
    
    # -f 判断文件是否存在
    if [ -f "${INSTALL_DIR_A}" ]
    then
    echo "======验证合成包是否成功======"
    lipo -info "${INSTALL_DIR_A}"
    fi
    
    
    #打开目标文件夹
    open "${INSTALL_DIR}"
     

     6.把目标文件夹里面的静态库和头文件 资源文件可以放在项目里 import  头文件然后调用

       

    参考:
    1.https://www.cnblogs.com/wgb1234/p/14258036.html

    2.https://www.cnblogs.com/richard-youth/p/14447991.html?ivk_sa=1024320u

    3.https://blog.csdn.net/shifang07/article/details/89177545

  • 相关阅读:
    Kibana6.x.x——启动后的一些警告信息记录以及解决方法
    Kibana6.x.x源码开发——执行 yarn start --no-base-path 启动命令后报错
    在Ubuntu中使用AppImage类型文件
    Kibana6.x.x源码分析--启动时basePath
    Kibana 视图开发入门参考文档
    npm install 安装包报错
    git学习--删除远程仓库不存在的分支
    git学习--远程分支删除
    git学习---去除版本控制
    git学习--clone和pull
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/14991029.html
Copyright © 2011-2022 走看看