关于iOS上的静态库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于iOS上的静态库相关的知识,希望对你有一定的参考价值。

最近再进行项目的真机调试,然后发现了一个天坑。就此研究了一些ios上的静态库的使用:

  首先我们是直接拿一个可以运行的项目来制作静态库的,网上大部分都是先创建静态库然后再写内容,看看我的方法。

  1.把子项目导入到总项目工程里面,然后删除子项目的运行文件,然后再里面创建一个静态库!!!(不要创建framework那个,非常坑。我给坑了好久具体下面在说吧)创建一个.a的静态库。名字没有什么影响自己喜欢就可以,我一般是按照原来的名字来的。

  2.然后在总项目工程里面添加链接  Build Phases ->Target Dependencies 和 Link Binary With Libraries 里面添加上我们自己创建的那个静态库。

  3.我们还需要在子项目里面进行一些配置 选择子项目,然后TARGETS 里面选择自己创建的静态库 Build Phases  ->Compile Sources 这个里面把自己需要的实现文件添加进去(.m文件) 如果文件很多的话其实还有一种偷懒的方法就是先创建静态库然后把这些文件从原来的项目里面拖过来,Xcode会自动添加这些实现文件。(我曾经自己添加100多个文件,有点烦。)

  4.这样就剩最后一步了,在主项目里面  TARGETS -> Build Settings -> User Header Search Paths 里面设置文件的位置。是文件夹的位置例:  ../PKQ/PKQ  ../是上级目录的意思。然后这个选项里面有一个选择recursive 的意思是遍历整个文件(有时候用的时候不好用。。) 

  5.这样我们就可以在其他地方调用我们的静态库了0v0

 

 

  然后接下来的就是一些注意点:

  1.静态库里面不能有 这种库 libsqlite3.tbd 这些文件。直接加到主项目里就可以了,那个bundle文件也加到主项目里面就可以了。

  2.如果静态库里面有分类 xcode是不能正常加载这些文件的 找到主工程的 Target -> Build Setting ->Linking 更改其 Other Linker Flags 为: -all_load 或 -force_load 即可。 -all_load的意思是把全部项目都加载进去,一般情况都可以添加这个不过首先会影响运行速度然后有时候其他文件就莫名其妙的报错了。我之前做的项目就遇见了这个问题,之前的项目是C++混编的然后使用-all_load 就会出现很多错误。这种时候就需要-force_load这个标签了, $(SRCROOT)/../Vendors/build/Debug-iphonesimulator/libVendors.a  路径就直接把静态库拉过去然后删除了""然后和-force_load 空一格就可以了。

  然后要提的是上面之前说的framework  xcode自带创建出来的默认是动态库,不能真机不能上架.然后你虽然可以改成静态库的。Target ->Mach-O Type 里面设置成Static Library就变成静态库了。但是这个静态库是.framework是不能使用-force_load这个标签!!!(我最后有删除这个创建一个.a的静态库重新拉了实现文件= =)

  3.不知道还有什么注意了。就剩下静态库的合成了,因为经常要改路径很麻烦。那我们把真机和模拟器的合成成一个.a文件。 这个我们要在终端里面来完成 cd 然后目标路径  有2个操作   1.lipo -info 静态库文件   这样就知道静态库支持那个模式了   这个是大概看一下,不过基本上没有什么用    2. lipo -create Debug-iphoneos/libVendors.a Debug-iphonesimulator/libVendors.a -output libVendors.a   这个是把2个路径的静态库合成成一个静态库的指令。合成成功后把新的静态库拖到原来的路径上覆盖就可以了。

   如果我上面说的有什么问题请告诉,我也是个新手。希望能帮助到你

 

 

 

以上是关于关于iOS上的静态库的主要内容,如果未能解决你的问题,请参考以下文章

ios开发静态库生成

iOS-静态库的创建与使用

IOS 静态库的和.framework制作

iOS 静态库打包流程简化

iOS 静态库打包流程简化

静态库上的 Xib 文件