• iOS开发过程中,有些时候需要生成打包.a静态库,然后拖入到项目中使用,尤其是有时候引入的一些C++编译过的第三方文件就会引起编译错误的提示,解决这种问题的方法很简单,就是把这些三方的文件打包生成.a静态库...

           iOS开发过程中,有些时候需要生成打包.a静态库,然后拖入到项目中使用,尤其是有时候引入的一些C++编译过的第三方文件就会引起编译错误的提示,解决这种问题的方法很简单,就是把这些三方的文件打包生成.a静态库文件,这样就解决了OCC++混编引起的错误,这种解决问题的原理是.a静态库文件时编译好的二进制文件,二进制文件与二进制文件相互混编肯定没有什么问题。

           一般情况下,打包.a静态库的大概步骤分为七步分:生成创建静态库、实现需要使用的类、设置公开类的.h文件、编译打包模拟器静态库、编译打包真机静态库、合并模拟器和真机编译好的静态库、拖入需要使用的项目中测试静态库。那么下面就分模块讲解打包.a静态库文件的步骤了。

          一、生成创建静态库

    1.打开Xcode,选择Create a new Xcode project新建项目,或者在已打开项目工程的情况下点击Xcode,使用快捷键command+shit+n创建新的项目;

    2.创建新的项目时候,在选择类型的里面,选择iOS-->Framework&Library-->Coaoa Touch Static Library,然后点击Next即可。





          二、实现需要使用的类

    1.创建静态库之后,把你想要打包成静态库的类文件都拖入到这个项目工程里面,然后把创建项目自动生成的那个类如果没有需要就把它直接删除即可;

    2.如果拖入整个文件夹进去,文件夹里面的所有类文件都要放在处于一级目录下面,尽量还是不要直接拖入文件夹,一般全选所有的类文件拖入即可。


          三、设置公开类的.h文件

    1.公开类的.h文件就需要添加Headers这个选项,具体步骤为:项目的TARGET-->Build Phases-->点击“+”号-->New Headers Phase
    2.然后找到刚才新加的Headers子目录下面的那个"+",点击“+”号添加所有需要公开的类的.h头文件;
    3.添加完所有需要公开的类的.h头文件之后,这些头文件都是处在Headers里面的Project子目录下,需要手动全选这些头文件直接拖入到上部的Public子目录下面。

    4.把类的.h文件全部拖入到Public里面之后,就成功设置为公开的头文件了。









          四、编译打包模拟器静态库

    1.打包编译之前需要配置一下工程文件,设置Scheme,有两个进入设置的方法,方法一:Xcode顶部菜单栏里面找到Product-->Scheme-->Edit Scheme...,找到Run-->Info里面-->Build Configuration里面选择Debug模式,选择之后点击Close;方法二:从Xcode里面直接进入,Edit Scheme...,找到Run-->Info里面-->Build Configuration里面选择Debug模式,选择之后点击Close即可。

    2.设置完Scheme之后,在项目运行程序类型选项里面,选择模拟器模式,然后使用快捷键command+b编译打包模拟器静态库;

    3.编译成功之后,Products中的.a文件会由红色变成黑色,这就说明编译打包的模拟器静态库打包成功。






          五、编译打包真机静态库

    1.上部分模拟器静态库打包编译成功之后,仍然在项目运行程序类型选项里面,选择真机模式,然后依然使用快捷键command+b编译打包真机静态库;

    2.编译成功之后,Products中的.a文件会由红色变成黑色,这就说明编译打包的真机静态库打包成功。



          六、合并模拟器和真机编译好的静态库

    1.上部分真机静态库打包成功之后,在Producets里面,用鼠标单击选中右键,Show in Finder显示文件位置,然后打开编译后的模拟器和真机的.a静态库文件的位置;

    2.你在Products文件了里面可以看到两个文件夹,Debug-iphoneos是真机的静态库文件位置,Debug-iphonesimulator是模拟器的静态库文件位置,然后打开电脑终端;

    3.在电脑终端里面,使用命令行的方式合并模拟器静态库和真机静态库文件,具体的命令行格式为:lipo -create "真机的.a静态库路径" "模拟器的.a静态库路径" -output "合并后的.a静态库路径"  这里需要特别注意两点:真机静态库路径 和 模拟器静态库路径之间的空格,合并后的静态库名字要和模拟器和真机静态库的名字一致。)

    4.如果以上操作没有出错,终端会在你指定的文件夹下生成一个合并版的.a静态库,找到你指定合并后的.a静态库存放位置,把合并之后的.a静态库拷贝出来。







          七、拖入需要使用的项目中测试静态库

    1.打开你想要使用.a静态库的项目,然后把你刚才复制出来的合并之后的.a静态库和所有的生成打包之后的类的.h文件都拖入到项目中;

    2.然后command+b看看是否报错,然后进行配置修改,一般没有问题,但是不排除你的文件拖入项目之后提示找不到的问题,自行排查一下即可;

    3.然后在你需要使用的具体地方,引入需要使用的.h文件,然后进行测试使用即可。到此,.a静态库的制作介绍完了。






           到此为止,生成.a静态库文件的步骤就全部结束了,同时也是本人2017年写的最后一篇博客,要想了解更多分享知识,咱们来年继续探讨交流,本人微信公众号也会不间断更新不同技术分享,欢迎大家关注!




    展开全文
  • iOS中的.a文件

    2017-06-01 16:54:08
    Objective-c语言有.h .m 文件组成。静态库可以将 .m文件封装成一个.a文件,第三方....a文件与 iOS静态库 首先看静态库和动态库的区别: 在实际的编程过程中,通常会把一些公用函数打包成函数库,供其它程序调用



    Objective-c语言有.h .m文件组成。静态库可以将 .m文件封装成一个.a文件,第三方应用程序只需要拿到这个.a文件和代码对应的.h文件即可使用静态库中封装的方法。IOS静态库适合去制作第三方提供的SDK


    .a文件与 iOS静态库


    首先看静态库和动态库的区别:


    在实际的编程过程中,通常会把一些公用函数打包成函数库,供其它程序调用,不但提高了代码的复用;而且还保护了核心技术。所以在实际的项目开发中,经常会使用到函数库,函数库又分为静态库和动态库两种。

    和多数人所熟悉的动态语言和静态语言一样,这里的所谓静态和动态是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

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


    iOS静态库的使用


    1、创建静态库

    打开XCode新建一个项目,选择Library下的“Cocoa Touch Static Library”,在Classes文件夹上点右键选择“New File…”,然后在“Cocoa Touch Class”下选择“Objective-C class”,这样就可以创建Objective-C风格的源文件和头文件。

    同样,也可以创建C或者C++风格的代码,在Classes文件夹上点右键,选择“New File…”,这次选择Mac OS X下的“C and C++”,就行。

    然后在文件里编写具体的调用代码。

    最后进行编译,就会产生一个以.a为结尾的文件,就是我们需要的静态库。同时我们也需要生成的.h头文件。


    2、使用静态库

    在需要调用静态库的工程的目录下通过右键点Frameworks->Add->Existing Files..添加之前创建的.a静态库文件,然后在需要调用静态库的函数的.h文件里,import进来和静态库中.m对应的.h头文件,并且声明静态库里的类:@class类名,这样就可以使用静态库里的函数了。


    3、联调静态库

    如果单单以copy的方式包含进.a静态库,这样只能使用静态库,如果需要修改静态库里的函数,则需重新生成静态库,并将其重新包含进来,在开发阶段会显得比较麻烦。可以采用XcodeCross-Project Reference(跨项目参考)的方式解决。

    首先把静态库的XCode项目整个包含进我们的当前项目(注意:不要选择Copy items to destination group's folder选项)。

    接着和第二步一样也是包含进.a静态库(也要注意:不要选择Copy items to destination group's folder选项)。

    这样就可以从我们当前的项目里直接打开静态库的项目,直接修改(注意:修改后编译前必须选择clean,清除原有的静态库,重新生成)。现在发现一个简单的调用静态库的方法

    framework右键点击add-->ExistingFramework-->add other浏览静态库(.a)文件添加进来,就可以使用。

    展开全文
  • iOS库 .a与.framework区别

    2017-10-31 18:03:45
    一、什么是库? 库是共享程序代码的方式,一般分为静态库和动态库。 二、静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。....a和.framework 四、iOS里动态库形式?

    一、什么是库?

    库是共享程序代码的方式,一般分为静态库和动态库。

    二、静态库与动态库的区别?

    静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

    动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

    三、iOS里静态库形式?

    .a和.framework

    四、iOS里动态库形式?

    .dylib和.framework

    五、framework为什么既是静态库又是动态库?

    系统的.framework是动态库,我们自己建立的.framework是静态库。

    六、a与.framework有什么区别?

    .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。

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

    .a + .h + sourceFile = .framework。

    建议用.framework.

    七、为什么要使用静态库?

    方便共享代码,便于合理使用。

    实现iOS程序的模块化。可以把固定的业务模块化成静态库。

    和别人分享你的代码库,但不想让别人看到你代码的实现。

    开发第三方sdk的需要。

    八、制作静态库时的几点注意:

    1 注意理解:无论是.a静态库还.framework静态库,我们需要的都是二进制文件+.h+其它资源文件的形式,不同的是,.a本身就是二进制文件,需要我们自己配上.h和其它文件才能使用,而.framework本身已经包含了.h和其它文件,可以直接使用。

    2 图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容可以向其中添加图片资源。

    3 category是我们实际开发项目中经常用到的,把category打成静态库是没有问题的,但是在用这个静态库的工程中,调用category中的方法时会有找不到该方法的运行时错误(selector not recognized),解决办法是:在使用静态库的工程中配置other linker flags的值为-ObjC。

    4 如果一个静态库很复杂,需要暴露的.h比较多的话,就可以在静态库的内部创建一个.h文件(一般这个.h文件的名字和静态库的名字相同),然后把所有需要暴露出来的.h文件都集中放在这个.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出来就可以了。

    展开全文
  • 一、创建静态项目创建一个新的工程,选择Framework & Library下面的Cocoa Touch Framework。二、在静态库中添加内容这里,我就把我自己平时封装的一个工具类拖进来。 三、设置对应的参数 Build Active Architecture...

    一、创建静态项目

    创建一个新的工程,选择Framework & Library下面的Cocoa Touch Framework

    这里写图片描述



    二、在静态库中添加内容

    这里,我就把我自己平时封装的一个工具类拖进来。

    这里写图片描述


    三、设置对应的参数

    • Build Active Architecture Only选项设置
      Build Setting里面的Build Active Architecture Only设置为NOBuild Active Architecture Only设置为YES时,是为了debug的时候编译速度更快,此时它只编译当前的architecture版本。设置为NO时,会编译所有的版本。

    这里写图片描述


    • Debug版本和Release版本的切换

      这里,我要讲一下DebugRelease版本的区别。

      Debug是调试版本,主要让程序员使用。在调试的过程中Debug会启动更多的服务来监控错误,运行速度较慢,而且比较耗能。

      Release是发布版本,主要让用户使用,在使用的过程中会去掉那些繁琐的监控服务,运行速度相对较快,而且比较节约内存。

      这里,我们在Debug版本和Release版本下,使用模拟器和真机进行编译,生成DebugRelease模拟器和真机版本的静态库。

    这里写图片描述

    这里写图片描述

    这里写图片描述


    四、查看生成的静态库

    直接点击静态库,然后Show In Finder,就显示出你的静态库所在路径。此时,你会发现,已经生成了DebugRelease版本下模拟器和真机类型的.a静态库。

    这里写图片描述


    五、合并静态库

    经过我实践证明,Release版本下的真机和模拟器类型的静态库可以合并,当然Debug版本下的真机和模拟器类型的静态库也可以合并。但是,ReleaseDebug版本下的静态库不能互相合并。如果小弟哪个地方错了,大神们请指教。

    查看静态库设备支持类型:lipo -info 静态库路径

    合并静态库:lipo -create 静态库1的路径 静态库2的路径 -output 要生成的静态库路径+静态库名称


    六、使用静态库

    直接把生成的.a库拖到Xcode里面来,然后在Bulid Phases-->Link Binary With Libraries里面添加你的库

    注意把头文件也导进来,不然你没法用。

    这里写图片描述

    这里写图片描述


    七、可能遇到的问题

    情况一:

    当你打包静态库的时候,你的文件里面可能用到动态库,比如libz.tbd这个库。这时候直接Command+B编译生成库文件会报错,iOS 9之后,不能用libz.tbd这个了,换另种方式。

    方法:

    Go to Build Phases >Link Binary with Librairies > + > Add other

    这里写图片描述

    这里写图片描述

    这里写图片描述



    情况二:

    当你的静态库中用到自定义的控件或者分类时候,你会发现,导入静态库的时候,你的工程会报错。

    解决办法:
    Build Setting—>Other Linker Flags 选项添加:-all_load 或者 -ObjC。至于这两个参数有什么区别,请参考:关于Xcode的Other Linker Flags



    情况三:

    这里,小弟不才,对静态库的理解不深。我只是知道,你的静态库中使用到其他的库时候(比如framework或者.a库),当你编译好你的静态库时候,把你的静态库导入到新的工程里面,你还是需要在新的工程把你刚才静态库里面用到的库再导入一遍。

    也就是说,静态库只会编译你的代码,你导入的库并不会一并编译成静态库。举个例子,我的项目集成了讯飞语音的SDK,虽然我在静态库里面已经导入了讯飞语音的SDK,但是我把我的静态库导入到新的工程来用时候,发现如果不重新导入一遍之前的库,会报错。

    再举一个例子,即使你导入了讯飞语音的SDK,讯飞语音的指导书里也说了,你还需要导入12个framework库,由此可见,静态库只是编译你的代码而已。至于库,还是由APP工程来导入才合理。



    情况四:

    不得不说,是因为我在Xcode 9里面呆的太久了,以至于我回到实际项目开发中,都还在用Xcode 9来开发。那么就会遇到一个问题:Xcode 9里面编译静态库后,是不能用于iOS 10的真机的,但是可以用于模拟器。(具体什么原因,暂时还没弄清楚)。

    也就是说,你要在iOS 10里面用静态库,那么这个静态库必须是Xcode 8编译出来的静态库。

    不过,距离Xcode 9正式发布还有2天,目前还是GM版的。不管啦,等Xcode 9正式发布,再去重新下载。

    展开全文
  • lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a -output SQY/iOS/libGamePus.a 其中SQY/iOS/iphoneos/libGamePlusAPI.a //为真机库。  SQY/iOS/iphone...
    lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a  -output SQY/iOS/libGamePus.a

    其中SQY/iOS/iphoneos/libGamePlusAPI.a //为真机库。  

     SQY/iOS/iphonesimulator/libGamePlusAPI.a //为模拟器库
     -output SQY/iOS/libGamePus.a //为两个合并后存放的路径

    然后可以输入命令测试下是否成功  

    lipo -info SQY/iOS/libGamePus.a  //下面是输出 armv7 i386 有了两个就表情模拟器和真机都支持  其中armv7为真机架构 i386为模拟器
    Architectures in the fat file: SQY/iOS/libGamePus.a are: armv7 i386

    这二个库一个是用于真机运行的一个是用于模拟器运行的.其实我们可以利用lipo将这二个文件打包成一个通用的a文件。命令如下:

    将/Users/user/Library/Developer/Xcode/DerivedData/UITab-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products替换成你的路径。

    将/Users/user/Desktop/libPrint.a替换成合并后的路径。

    lipo -create /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphonesimulator/libPrint.a  /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphoneos/libPrint.a  -output /Users/pjk1129/Desktop/libPrint.a
    展开全文
  • lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a -output SQY/iOS/libGamePus.a
  • 网上流传了太多关于合并lib库的方法,自己也尝试过,但大多失败。有感于这种急于解决问题,经过百般尝试后依旧无果的无奈心情,小翁在这里用一个实例来完整...本文的目标:合并libDomobOfferWallSDK.a、libDomobAdWa
  • iOS 打包静态库.a文件

    2015-10-28 09:14:21
    3、将需要暴露的.h文件暴露出来,.m会自动编译到.a文件中 4、分别选择真机设备和模拟器,command + B编译,staticTest会从红色变成黑色。真机和模拟器环境下用的.a文件是分开的。 5、在“Show in Finder ”,可以...
  • IOS 之.a文件的合并

    2014-10-22 15:05:23
    使用终端根据需要文件的目录
  • Ios Xcode工程添加.a文件引起错误的几种修改方法(一般是微信的.a静态库出错) 一、 TARGETS -> Build Settings-> Search Paths下 1. Library Search Paths 删除不存在的路径,保留.a文件的路径(此处显示的为...
  • 引言在开发中.framework静态库还是比较常见的,比如:SDK,公司间的代码合作等。我们可以把一些不愿意让别人见到的代码,用静态库的方式把它隐藏起来,只留下.h文件显示方法供编程人员使用。而.a文件出了静态库本身外...
  • 最近一个人在做一个即时通讯SDK的项目,所以就用到了静态库的打包,开始遇到一些困难和莫名的bug,不过现在已经基本完成。现在,浅谈一下个人经验。首先,概述一些最基本的名词概念,也是为了大家能更好的理解我们...
  • iOS开发中,Xcode 7.0也就是iOS9.0中开发中要求App内访问的网络必须使用HTTPS协议,以此来提高数据传输之间的安全性。  那么新创建的项目没用采用https怎么设置?如果发现在网络请求失败,Xcode后台报错信息为:...
  • 如果在项目中加入多个第三方库后出现类似下面的问题(XXX.o重复定义): ...duplicate symbol _OBJC_CLASS_$_EAGLView in: /Users/XXXname/Library/Developer/Xcode/DerivedData/XXObjext-gcnzoms
  • 今天在网上找到了Assets.xcassets的相关博客,对Assets.xcassets进行比较全面的学习,现记录一下: 感谢一下网友的博客,我们之所以可以站的更高走的更远,是因为我们站在巨人的肩膀上,...iOS 我所知道的Assets.xc
  • 我们开发中经常会遇到使用第三方功能的.a静态库文件. 有的.a文件支持的架构比较多,x86,arm64,arm7s,arm7这样我们编译的时候不会出错.但是如果支持的架构越多.我们最终生成的ipa包将会越大.比如x86的架构,我们上线...
  • 最近ios开发项目,遇到了,在device运行和模拟器运行都需要引用.a库,两个库的名字相同,分别放在了连个文件夹下面。但是运行起来的时候总是报错。说明是引用库的问题。 因为是在真机运行可以通过,但是模拟器编译...
  • iOS开发初学者需要经常去的论坛或网站  Apple Developer:网址:https://devforums.apple.com/[美国 Apple公司]上有很多文档,对英语的要求也稍高,适合敲完上面两个网站的入门教程后,做参考和提升...
  • 许多第三方提供的.a文件(一般是那些SDK),嵌入到我们的xcode项目后,生成不会报错。   一部分粗心的SDK提供方,或者我们自己做的.a文件,就会有报错,常见的就是不是armv7结构,或者不是armv7s结构,如果在...
  • iOS SDK开发

    2018-02-23 17:30:21
    一、.a静态库的创建和使用 1. 创建一个静态库工程 打开Xcode ,点击File\New\Project,选择iOS\Framework and Library\Cocoa Touch Static Library新建一个静态库工程. 将名字命名为MySDK,然后保存。 一...
1 2 3 4 5 ... 20
收藏数 145,736
精华内容 58,294