首页 > 其他分享 >IOS静态库相关-封装lib

IOS静态库相关-封装lib

时间:2023-06-14 10:04:53浏览次数:40  
标签:文件 封装 工程 lib 静态 IOS 编译 头文件


 IOS静态库相关-封装lib

 

 

   第一:基本知识         在实际的编程过程中,通常会把一些公用函数制成函数库,供其它程序使用,一则提搞了代码的复用;二则提搞了核心技术的保密程度。所以在实际的项目开发中, 经常会使用到函数库,函数库分为静态库和动态库两种。和多数人所熟悉的动态语言和静态语言一样,这里的所谓静态和动态是相对编译期和运行期的:静态库在程 序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运 行期间还需要动态库的存在。(动态库不是很理解)

        对iPhone平台来说,iPhone官方只支持静态库联编。

 

    第二:两种方式

     第一种方式:
     直接封装lib.a,向使用者提供头文件列表。使用者引用头文件并且使用其中方法,但是看不到实现文件的内容。这种方式每当静态库函数需要修改时就必须重新生成lib.a提供给使用者更换,比较麻烦,但有助于保密。

     制作静态库
     New Project -> IOS Library ->Cocoa touch Static Library 这样就新建了一个静态库的工程,将你要打包成lib的.m,.h放到class目录下面,然后build就可以了. 打包的时候要分清楚是debug,release.

     使用静态库
     在需要调用静态库的工程的目录下通过右键点 Frameworks->Add->Existing Files..添加之前创建的.a静态库文件,然后在需要调用静态库的函数的.h文件里,import进来和静态库中.m对应的.h头文件,并且声明静态 库里的类名头文件,这样就可以使用静态库里的函数了。(此处可以做一个头文件包含静态库中所有的头文件,只需声明这一个头文件就可以使用所有的相应头文件 的方法)

     问题及注意事项:
     0. .a文件路径:/Users/zhangss/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/
         不同模式下可以生成不同类型的.a文件 真机/模拟器与Debug/Release选项公交叉成4种.a文件    
     1.打包分清楚是debug与Release的。
         选择debug与Release在Xcode工具栏的Product选项现则Scheme->Edit Scheme.然后为各个运行模式选择选项。    
     2.分清楚lib是i386(真机)或者ArmV7(模拟器)模式
         终端下使用命令 lipo -info libPrint.a 可以查看.a的属性。如结果:libPrint.a is architecture(构建): armv7      
     3.引用lib库。
         把.a及.h文件加入到测试工程中,然后就可以使用相关的代码方法了。    
     4.把真机运行和模拟器运行的.a文件合并生成通用的.a文件,完成通用的静态库
         终端使用命令 lipo -create 真机.a路径 模拟器.a路径 -output 目标路径(如/users/zhangss/desktop/***.a)
         然后info查看合并后.a的信息就会发现它已经同时具备了armv7和i386的条件
     5.在Build Phases->Compile Source中的文件,表示这些代码会被编译进lib中,你可以删掉你不希望被编译的。

 

 

 

     第二种方式:
     静态库与工程关联,做成联调静态库,可以参考Xcode的Cross-Project Reference跨平台项目。
     
     创建联调工程   
     1.在工程的Targets上右键.Add -> New Target -> Static Library 比如我们建了一个example的target
         PIS:也可以新创建一个lib工程,工程中add Existing File..增加已经存在的lib工程进来(不要选择copy to folder)。
     2.增加你需要加入的.h.m文件,然后查看在Build Phases->Compile Source中的文件,表示这些代码会被编译进lib中,你可以删掉你不希望被编译的,增加你想要编译进去的文件。
     3在工程的target上双击,targets->Build Phases里面Target Dependencies里面增加lib工程的target,这样编译工程时也会编译lib工程生成lib.a文件。
     4.引用lib头文件:在项目文件工程文件的target的build Setting->Header Search Paths中增加头文件路径(../文件名(lib工程文件名/ 例如../MyLibPrint/),这个路径适应于lib工程与项目工程在同一目录),选择成递归类型。
     然后再工程的某个文件中引用一下lib工程的头文件,如果不报错说明头文件引用成功。然后就可以使用头文件中的声明的方法了。


第三:部分错误信息处理
     1.undefine symbols for architecture i386 错误。
      其实这个错误原因很简单,就是因为,我们用错了编译出来的libUITab.a lib,
      在模拟器里面,我们需要的是基于i386构架编译的static lib,但是这个a文件,大家还记得前面说的arm6 arm7构架的么。这个a其实是在iphone这个arm构架上运行的代码。
      那如何编译i386的库呢?运行之前选择Print>IOS Device,将这个iOS Device修改成iPhone5.0 Simulator。在进行编译,这样就可以编译出i386下面的库。
      下面最多有四个文件夹分别命名为:Debug-iphoneos/Debug-iphonesimulator/Release-iphoneos /Release-iphonesimulator这四条目录每个目录下同样也有一个libPrint.a文件。Release-iphoneos里面的 是基于arm6 arm7编译出来的库文件。Release-iphonesimulator文件夹下面的是基于i386编译出来的文件。

      2.在编译RegexKitLite的时候,报错如下:
      在项目的编译设置中找到Other Linker Flags,然后在后面字段空白处双击,添加“-licucore”就可以了,引用正则框架必须打开此开关。-licucore,注意不要打错,打错了会 报错误:clang: error: no such file or directory: '-licucore'

 

 

 

 

 

标签:文件,封装,工程,lib,静态,IOS,编译,头文件
From: https://blog.51cto.com/u_16160131/6475578

相关文章

  • axios-使用解构赋值
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="utf-8"><title></title></head><body><buttonid="btnPost">发起POST请求</button><buttonid="btnG......
  • axios-结合async和await调用axios
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title></head><body><buttonid="btnPost">发起POST请求</button><scriptsrc="lib/axios.js">&......
  • 2015年11月Xcode7.1(7B91b)打包发布苹果iOS应用指南
    2015年11月Xcode7.1(7B91b)打包发布苹果iOS应用指南 第1步:配置项目的开发授权证书(图1)如图1,选择TARGETS下的项目名称。(图2)如图2,选择BuildSettings,然后找到ProvisioningProfile. (图3)如图3,选择distribution的开发授权证书。这个distribution的开发授权证书来自苹果开发者后台配置......
  • ios NSString format 保留小数点 float double
     iosNSStringformat保留小数点floatdouble self.orderCost.text=[NSStringstringWithFormat:@"%.1f元",self.order.cost.floatValue];%.1f 表示小数点一位,%.2f表示小数点2位,依次类推.格式定义TheformatspecifierssupportedbytheNSStringformattingmethodsa......
  • iOS程序运行生命周期
    iOS程序运行生命周期  在文件AppDelegate.m中定义了iOS程序运行的各个生命周期,清楚了解程序运行中的每个生命周期,对于我们的开发工作将提供极大的帮助。下面代码就是AppDelegate.m中各生命周期对应的方法。 -(BOOL)application:(UIApplication*)applicationdidFinishLaunch......
  • 【原】iOSCoreAnimation动画系列教程(一):CABasicAnimation【包会】
    【原】iOSCoreAnimation动画系列教程(一):CABasicAnimation【包会】 在iOS中,图形可分为以下几个层次: 越上层,封装程度越高,动画实现越简洁越简单,但是自由度越低;反之亦然。本文着重介绍CoreAnimation层的基本动画实现方案。在iOS中,展示动画可以类比于显示生活中的“拍电影”。拍电影有......
  • iOS-自定义的画圆或弧的UIView
     iOS-自定义的画圆或弧的UIView CustomViewOfCircle.h#import<UIKit/UIKit.h>@interfaceCustomViewOfCircle:UIView{//是否自定义属性:myDotBOOLisDefinedMyDot;//是否自定义属性:myRadiusBOOLisDefinedMyRadius;//是否自定义属......
  • iOS开发问题集锦
     1.Xcode开发连真机运行报错Pleaseverifythatyourdevice’sclockisproperlyset,andthatyoursigningcertificateisnotexpired. 1.在正常运行的工作电脑上的Xcode导出开发者账号(*.developerprofile)或PKCS12文件(*.p12)进入XcodePreferences|Accounts:选中Apple......
  • Libssh认证绕过CVE-2018-10933漏洞复现
    0x00漏洞描述libssh0.6 及以上的版本,在服务端的代码实现中存在身份认证绕过漏洞。在向服务端认证的流程中,攻击者通过将 SSH2_MSG_USERAUTH_REQUEST 消息替换为 SSH2_MSG_USERAUTH_SUCCESS,即可在无需任何有效凭证的情况下认证成 0x01漏洞影响版本libssh0.8.x-0.8.3l......
  • 二次封装Axios完全体
    importaxios,{Axios}from"axios";importtype{AxiosRequestConfig}from"axios";import{message}from"antd";//功能失败的错误原因constauthErrMessage:any={ 10031:"登录失效,需要重新登录", 10032:"您太久没登录,请重新登录~......