您的位置:首页 > 其它

如何创建一个静态库文件,并打包在模拟器和真机上都可以使用。

2015-08-19 09:16 706 查看
在开发过程中我们往往会遇到这种情况,我们从网上down的静态库文件(.a文件)在模拟器上运行但是在真机上会报错说缺少arm7 arm64 。也有在模拟器上出现问题说缺少 x86_64 或者缺少i386.这种问题怎么解决呢?

一般情况下在从网上下载静态库的时候里面会有真机的一个.a文件 模拟器的一个.a文件。我们在测试的时候不可能不停地替换两者。有没有一种好的解决方案来解决这个问题呢。答案是肯定的,我们可以通过控制台来把两者合并成一个通用的.a文件 让他既能在模拟器上正常运作也能在真机上正常运行。

ok 我们先来创建一个静态库文件。

第一步:

Xcode New一个新的project,选择IOS下面的Framework&Library,下面有一个Cocoa Touch Static Library。直接next去建立一个MtimeLibrary这样的工程。



第二步:工程建立以后,删除默认的.h .m 文件,然后自己创建要打包的.h
.m 文件。


选择move to Trash 永久性删除文件。



这里添加了一个具有NSUserdefaults 功能的SKUserfefaults 可以根据自己的需要自行添加.

第三步:选择模拟器 ,Command + B 编译,我们可以在Products下面找到我们编译生成一个模拟器上可运行的libTestPointA.a这个文件,然后选择真机(如下图)再编译一次,这样会生成一个可以真机运行的libTestPointA.a库。



ok 下面我们通过命令行进入到我们编译的.a文件查看一下.a文件的信息.

//打包后保存.a的地址我们可以通过上图中的show in finder 来找到 然后 找到该地址

命令行进入到里面:

cd /Users/username/Desktop/TestPointA/Build/Products/Debug-iphoneos

然后查看里面打包.a文件的信息

lipo -info libTestPointA.a

命令行的操作台会打印出:Architectures in the fat file: libTestPointA.a are: armv7 arm64

这表明我们打包的.a文件支持arm7 和arm64.

然后我们进入模拟器打包的.a文件

cd /Users/username/Desktop/TestPointA/Build/Products/Debug-iphonesimulator

然后查看信息

lipo -info libTestPointA.a

操作台打印出了

libTestPointA.a is architecture: i386

OK,我们通过编译 已经做好了两个.a文件 那么这样就可以使用了吗?

答案是NO。因为iPhone4s iPhone5 模拟器支持的是architecture i386 而 iPhone5s iPhone 6 iPhone6 Plus 支持的是architecture
x86_64. 真机上是 arm7 和arm64 。我们打包的真机的.a在真机上运行是没问题的。

看下我们模拟器运行的效果



啊 我模拟器上打包怎么会出问题。 好吧 !问题来了!正如上面所说因为iPhone4s
iPhone5 模拟器支持的是architecture i386 而 iPhone5s iPhone 6 iPhone6 Plus 支持的是architecture x86_64. 真机上是 arm7 和arm64 。

刚在包打的只是
iPhone4s iPhone5 上面的i386 。x86_64我们还没打包呢。那怎么办呢 。ok 我们把刚才编译的.a文件拉出来 放到一个文件夹里。然后再在模拟器iPhone5s 或者6 或者6plus 重新编译一下。ok 现在我们已经有了 三个.a文件。一个真机的两个模拟器的。难道我们使用的时候要三个来回不停的切换吗?答案是否定的。

第四步:ok
下面来讲一下我们如何 将这三个打包成一个通用的.a文件。

通过lipo -create 命令来合并3个静态库文件。( -output 后面的"/Users/username/Desktop/TestPointA/Build/libTestPointA.a" 是合并后的路径和文件名字)

lipo -create "/Users/username/Desktop/TestPointA/Build/Products/Debug-iphoneos/libTestPointA.a" "/Users/username/Desktop/TestPointA/Build/Products/Debug-iphonesimulator/libTestPointA.a"
"/Users/username/Desktop/TestPointA/Build/Products/libTestPointA.a" -output "/Users/username/Desktop/TestPointA/Build/libTestPointA.a"

通过这里我们可以看到我把三个.a文件合并成了一个.a文件。下面我们来通过命令行来查看一下 我们刚才打包合并的3合一的.a文件怎么样。

lipo -info libTestPointA.a

Architectures in the fat file: libTestPointA.a are: armv7 i386 x86_64 arm64

ok 通过上面我们可以看到我们打包的3合一.a文件已经成功搞定。支持了我们所需要的模拟器和真机.

第五步:使用

我们新建一个工程把我们三合一.a文件和我们的.h文件拉到我们的工程里。



然后使用:







ok 。运行一下完全没问题。真机和模拟器 都没问题。 好了。我们已经做了一个能在模拟器和真机同时运行的.a文件,还等什么,你也来试试创建自己的第一个静态库文件吧!just do it!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: