前段时间研究了一下怎么制作.a文件,踩了不少坑,特别是Cocoapods打静态库的包,坑了好久好久,其中遇到的很多坑不太记得了,把记得的顺便记一下。第一次写这种文章,有什么错误,请各位多多批评指正。
Cocoapods打静态库的包
1、打开终端,cd desktop
2、pod lib create RtcLib 创建打包工程
3、桌面会出现一个RtcLib的工程文件,终端上会要你回答几个问题,比如:名字,邮件,使用什么语言开发,包不包含测试demo等等
4、回答完问题会自动打开项目,
目录结构如此,打开里面的podspec配置文件,进行配置
我大概就是这样配置的,name,version,summary就是工程名,版本和简单描述。homepage是说工程主页的地址,有github地址的可以填自己github上的地址,貌似也可以不用改,我没改,好像也没出多大问题。但是一定要改s.source的地址,可以改成github上项目的地址,没有的话可以像我一样,改到电脑桌面,还有deployment_target的版本,我是支持到了7.0,你们任意。
s.source_files,我看了相关文档,是放类库的源文件的s.resource_bundles 表示资源文件存放目录;s.frameworks 表示类库依赖的framework;s.dependency 表示依赖的第三方类库;但是我一直没搞懂,s.public_header_files难道不是暴露头文件的么,但是我一直暴露不出去,反正打出来的包,header里面就是空的。。。。我也不知道发生了什么。
配置文件改好之后,进入example,pod install,在这里我就踩了我的第一个坑,我的pod的版本之前一直没有更新,所以一直报一些莫名其妙的错,所以,把pod更新到1.0.1。还有,淘宝的源已经换了哦,在原来的http后加个s,ok!然后,又报错,说libjingle_peerconnection里含有libWebRtc.a静态库,哈哈,搞得我莫名其妙的,在stackoverflow上找到了解决的办法,进入工程把podfile里第一行的use_frameworks去掉,然后pod install,就成功了。记得如果有添加自己的类,一定要写在这里,替代ReplaceMe.m就好了。
5、提交源码并打上标签
cd 你的工程目录
git add .
git commit -m '0.1.0'
git tag -a 0.1.0 -m '0.1.0'
然后再验证。之前我没操作这步,结果报错,warning:counld not find remote branch 0.1.0 to clone fatal:Remote branch 0.1.0 not found in upstream origin fatal:The remote end hung up unexpectedly .然后,我就把homepage的地址换到了本地,加上了这一步就没有报错了。其中还遇到一个问题,因为电脑上装了几个Xcode,报错:unable to add a source with url 'https://github.com/cocoapods/specs.git' named 'master-1'.you can try adding it manually in '~/.cocoapods/respos' or via 'pod repo add'好像是因为装了几个Xcode导致路径变了,$sudo Xcode-select-switch 把Xcode拖到这,就ok了。
6、pod lib lint xxx.podspec 验证总是通不过,报静态库的错误,于是用了一个这样的命令,pod lib lint --use-libraries --allow-warnings --verbose,验证就通过了
7、安装一个打包的插件,sudo gem install cocoa pods-packager
8、打包命令,pod packager xxx.podspec --library -force,生成.a库,去掉library,生成framework库。
9、打包完之后,会发现原来的工程下多了一个文件,里面就含了你打包成功的.a或者framework。但是有一个很大的问题,我打包成功的文件导入我的demo中,一直用不了,还有,还是不知道怎么暴露项目中的自己的和第三方库的.h文件,希望有人能解答吧
第二种打包的方式:手动打包
为了这个手动打包,我也是挺不容易的,把原来含有cocoapods的项目,死拉硬拽的去掉了Cocoapods,把别人的代码变成了自己的,开始报了一百多个错误,我蒙掉了,但是,码代码这行,真的,有时候得有点耐心,我仔细看看错误,也没那么难解决,基本上就是少了一些系统库啥的。废话不多说
1、创建static Library,新建->project,选择static Library。
2、把EtmRTS的所有类拖入打包工程
3、在build phases下面修改一些东西
compile Sources:放工程的.m文件,这些文件会打入静态库中
Link Binary with Libraries:需要链接的库文件,这里可以将你需要的引用的库文件放入,会打入到静态库中。当你把所有类拖入该工程的时候,libWebRTC.a会自动被放入该目录下,一定要移除,否则会报错。
Copy Files:把要共享给外部的.h文件放在该目录下
4、在Build Settings里,将Archiectures里添加armv7s
5、模拟器运行时,product->Scheme->Edit Scheme->debug,command+B,点击finder,得到include和一个.a文件,真机运行时,product->Scheme->Edit Scheme->release,同样得到include和一个.a文件。
6.lipo –info xxx.a检查.a文件的支持的指令集
7、合并两个.a文件,lipo –create将两个.a文件依次拖至此–output路径,生成.a文件
例如lipo –create xxx.axxx.a-output/Users/xxx/desktop/xxx.a
注意:如果第三方库含有静态库打进去报错,就不要强行打进去了。ok,暂时就整理到这,还有一些问题是真的不记得了,也不知道当时是怎么解决的了