如何创建一个静态库文件,并打包在模拟器和真机上都可以使用。
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!
一般情况下在从网上下载静态库的时候里面会有真机的一个.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!
相关文章推荐
- python笔记:深刻理解Python中的元类(metaclass)
- hdu5399
- poj-3126 Prime Path
- 算法竞赛入门经典:第八章 高效算法设计 8.9棋盘覆盖
- Metronic 定制主题
- 互斥锁设计,有效的避免死锁
- CentOs笔记
- 对List进行高效的排序和倒排序代码实战之Scala学习笔记-26
- tools:context=".MainActivity的作用
- git 提交前撤销add操作
- OC类的深入研究
- poj2253 最小生成树中的最大边 prim
- LeetCode Binary Tree Preorder Traversal
- HDU 5400 Arithmetic Sequence(2015 Multi-University Training Contest 9 2015多校联合)
- SVM 多分类 -SVM分类opencv3.0源代码
- HDU 1269 -- 迷宫城堡【有向图求SCC的数目 && 模板】
- BZOJ 1695 [Usaco2007 Demo]Walk the Talk 链表+数学
- LeetCode Binary Tree Preorder Traversal
- iOS 网络请求,参数中字典嵌套字典
- UVA - 11346 Probability (概率)