`
stephen830
  • 浏览: 2978110 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IOS静态库相关-封装lib

 
阅读更多

 IOS静态库相关-封装lib

 

转载自 http://blog.csdn.net/zsomsom/article/details/9163635

 

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

        对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中,你可以删掉你不希望被编译的。

 

 

 

 

详细操作参考链接:

 

http://hi.baidu.com/sxgg008/item/43ab4146e460e4bbde2a9f38

 

 

     第二种方式:
     静态库与工程关联,做成联调静态库,可以参考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工程的头文件,如果不报错说明头文件引用成功。然后就可以使用头文件中的声明的方法了。

详细参考链接:

 

http://www.cnblogs.com/beginor/archive/2012/04/20/2459244.html

第三:部分错误信息处理
     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'

 

 

 

 

 

分享到:
评论

相关推荐

    IOS 封装静态库Demo

    在iOS开发中,静态库(Static Library)是一种将多个源代码编译成的二进制文件打包在一起的库...总之,iOS封装静态库是软件开发中的常见实践,它有助于代码的组织和复用,但也需要根据项目的具体需求来权衡其优缺点。

    编译好的ffmpeg静态库for iOS

    标题提到的是"编译好的ffmpeg静态库for iOS",这意味着我们得到了已经针对iOS设备编译过的FFmpeg库,且是静态链接的形式。静态库与动态库不同,它会将所有依赖项都包含在库文件中,这样在编译应用时,不需要在运行时...

    IOS 打包静态库详细介绍

    本篇文章将详细讲解如何创建和使用iOS静态库。 首先,我们需要了解一些基本概念。库,简单来说,就是一组预先编译好的函数和数据,可以被其他程序调用。根据开源程度,库可分为开源库(提供源代码)和闭源库(仅...

    openssl-1.0.2o静态库(IOS平台)libcrypto.a和libssl.a

    《OpenSSL在iOS平台的应用与libcrypto.a及libssl.a静态库详解》 OpenSSL是一个强大的安全套接层(SSL)密码库,包含了各种主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试...

    lib-mp4v2_IOS_build.zip

    在完成编译后,将生成的静态库(如.a文件)或动态库(如.dylib文件)保存备用。 4. **集成到iOS项目** 将编译好的libmp4v2库拖入Xcode项目中,确保在项目的"Build Phases"部分添加到"Link Binary With Libraries...

    lib-mp4v2-master

    提供的“lib-mp4v2_IOS_build.zip”文件包含了编译脚本、源码及相关的封装代码,这对于快速集成到项目中非常有帮助。通常,编译流程包括以下几个步骤: 1. 解压“lib-mp4v2_IOS_build.zip”,获取源码和其他必要...

    xcode10.0真机缺少的lib

    标题提到的“xcode10.0真机缺少的lib”,可能指的是开发者在尝试使用Xcode 10.0在真实设备上运行应用时,遇到了与动态库或静态库相关的错误。这些库可能是Apple提供的系统库,也可能是第三方库,它们对于应用的正常...

    画板功能的静态库源码demo

    在Android中,静态库通常以`.a`或`.lib`格式存在,而在iOS中则是`.a`文件。创建静态库通常涉及以下步骤: 1. 编译源码,生成对象文件(`.o`或`.obj`)。 2. 使用链接器(如`ar`工具)将对象文件打包成静态库。 3. 将...

    ideta-cross-platform-lib

    在跨平台开发中,这样的库通常扮演着关键角色,使得开发者可以编写一次代码,然后在不同的操作系统或设备上运行,如Windows、macOS、Linux,甚至Android和iOS。 让我们深入了解一下这个名为"ideta-cross-platform-...

    ffmpeg 2.3.2 for iOS i386/armv7/armv7s

    "lib"目录则包含了编译好的静态库文件,对应不同的CPU架构。将这些库文件集成到iOS项目中,可以实现FFmpeg的功能。 总的来说,FFmpeg 2.3.2 for iOS是开发者在iOS平台上实现多媒体处理功能的重要工具,通过其丰富的...

    ffmpeg 2.1.3 for iOS i386/armv7/armv7s

    `lib`目录则包含了编译好的静态库文件,分别是对应i386、armv7和armv7s架构的`.a`文件,这些库文件将在链接阶段被加入到最终的iOS应用中。 **集成到iOS项目** 要将FFmpeg 2.1.3集成到iOS项目中,通常需要执行以下...

    基于ObjectiveC的libopencore-amrnb的音频转换库及源码

    - **集成库文件**:将库文件添加到Xcode项目中,通常包括头文件和静态库文件。 - **配置编译设置**:根据需求选择是否开启bitcode,并确保库与项目的编译设置兼容。 - **调用接口**:通过Objective-C的API调用编码和...

    cocos2dx-3.3-libcurl

    这可能包括.lib或.a静态库文件,或者.so动态库文件,以及可能的头文件(.h)。这个过程需要谨慎操作,以免破坏原有项目的编译配置。 值得注意的是,描述中提到“压缩包里的Android.mk不要使用”。Android.mk是...

    二维码生成源码

    5. **静态库的构建与使用**:C++静态库(.a或.lib)是预编译的代码集合,使用时会直接链接到目标程序中。开发者需要了解如何使用`ar`或`lib`工具创建静态库,并在项目的链接阶段将其包含进来。 6. **API设计**:...

    flutter_lucklyshop-master.zip

    3. `android`和`ios`目录:这些是针对Android和iOS平台的特定配置,用于构建和发布应用。Flutter的跨平台特性使得开发者可以在一个代码库中同时为这两个平台编写代码。 4. `assets`目录:用于存放应用所需的静态...

    sqllite3_Sqllite3C++_hidexcj_

    - 链接:确保链接了 SQLite3 库(在 Windows 上可能是 `sqlite3.lib` 或 `sqlite3.dll`)。 - 调用 API:通过 `sqlite3_open()` 打开数据库,`sqlite3_exec()` 执行 SQL 语句,`sqlite3_prepare_v2()` 和相关函数...

    sdl2_x86-windows.7z

    在压缩包内,"sdl2_x86-windows" 文件夹可能包含了编译好的动态链接库(.dll)、静态链接库(.lib)、头文件(.h)以及可能的示例代码和文档。这些内容对于开发者来说至关重要,因为它们提供了在Windows环境下集成和...

    加密版 Sqlite3

    3. **wxSqlite3.lib**:这是一个静态库文件,用于链接到wxWidgets应用程序。在编译时,开发者的程序会链接到这个库,从而获得使用wxSqlite3.dll所需的所有函数和数据结构。 综上所述,“加密版 Sqlite3”是一种安全...

    SDK编程相关之3

    2. **库文件**:SDK通常包含各种预编译的库,如动态库(.dll/.dylib)或静态库(.lib/.a),它们封装了特定功能的代码,便于开发者集成到自己的项目中。 3. **开发工具**:例如IDE(集成开发环境)、编译器、调试器...

    InitDll.zip

    与静态链接库不同,动态链接库在程序运行时才被加载,而不是在编译时。这样可以节省内存,因为多个应用程序可以共享同一份库的内存空间。DLL文件通常包含函数定义、变量和其他资源,可供其他程序调用。在Qt中,可以...

Global site tag (gtag.js) - Google Analytics