ios静态库笔记-程序员宅基地

技术标签: 移动开发  xcode  嵌入式  

本身IOS的开发,只允许静态库或者Framework。

下面就简单写一个静态库和一个调用静态库的例子。

1.静态库工程的建立:

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

2.工程建立

我们添加很简单的"- (void)printA;"和"+ (void)printB;"的方法,这个方法的实现也是很简单的,在*.m文件中的实现就是一个"NSLog(@“”);"这样我们编译出来的libstaticlib就可以被其他的IOS工程进行调用了。这块注意一下,目前我们的Print->iOS Device

3.编译前准备

这里分release与debug版本,需要设置一下

4.OK,编译

我们可以在Products下面找到我们编译生成的libstaticlib.a这个文件。

注意未编译前为红色:左                             编译后为黑色: 右

5.ok

在右边 这个文件上右键Open In Finder。这时候我们打开了一个文件夹,里面有一个libPrint.a。后面我们继续编写一个调用这个libPrint.a的App。但是这个App在编译时候会出错,通过这个错误的解决,说明Xcode的一些编译相关的东西。这里,我们在command下面根据路径找到这个文件,用这个非常重要的命令查看一下这个lib的信息!

打开终端写入如下命令:这是什么?这就是所在的路径 

以下均是在自己的mac上的路径。你需要将/Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/ 替换成你的路径。

cd /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/  

我们手动打开这个路径:可以看到如下信息:Release-iphoneos

这个是给真机用的,那我们要给模拟器和真机封装的静态库应该都能用才好。这个下面介绍!!!!!  

然后再在终端 打开这个文件:cd /Users/user/Library/Developer/Xcode/DerivedData/UItab-dbvoszbzpavyglaboxgflvrnzfce/Build/Products/Debug-iphoneos

命令是:lipo -info libPrint.a,可以看到显示的结果是:Arch是  Arm7。下面我会具体介绍一下。

6.建立一个调用这个libPrint.a的应用

应用就很简单了,我们添加刚才libPrint.a的*.h文件。 然后在这个工程的Build Phases的Link Binary With Library里面添加我们刚才拷贝出来的那个libPrint.a。

7.插入了h和a文件后

我们就可以在control里面调用这个libPrint.a 函数了。

#import "AstroDiskAppDelegate.h"

#import "Print.h"

 

 

@implementation AstroDiskAppDelegate

 

@synthesize window = _window;

 

- (void)dealloc

{

    [_window release];

    [_viewController release];

    [super dealloc];

}

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    

    //调用libPrint.a

    [Print printB];

    Print  *print = [[[Print alloc] init] autorelease];

    [print printA];

 

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    [self.window makeKeyAndVisible];

    return YES;

}

8.OK,编译运行这个应用程序。

编译出现错误了。这个就是这篇文档的关键了。主要就是为了介绍编译静态库相关的东西。

9.可以看到undefine symbols for architecture i386这样的错误。

其实这个错误原因很简单,就是因为,我们用错了编译出来的libUITab.a lib,在模拟器里面,我们需要的是基于i386构架编译的static lib,但是这个a文件,大家还记得前面说的arm6 arm7构架的么。这个a其实是在iphone这个arm构架上运行的代码。其实show in finder指向的是一个ios device的库,并不是i386模拟器下的库。那如何编译i386的库呢?看见第二张图片的Print>IOS Device了么?我们将这个iOS Device修改成iPhone5.0 Simulator。在进行编译,这样就可以编译出i386下面的库。这个时候我们show in finder打开的文件夹还是ios device下的库。我们最好自己去那个目录下看一下。这里我们用command去查看了一下目录情况,如下:可以看到一个iphoneos的目录和一个simulator的目录。

然后我们再看看这个目录与第4条所示的目录有什么不同! 同样也有一个libPrint.a文件。

10.错误原因分析

Release-iphoneos里面的是基于arm6 arm7编译出来的库文件。Release-iphonesimulator文件夹下面的是基于i386编译出来的文件。

11.合并.a文件,制作通用静态库

这二个库一个是用于真机运行的一个是用于模拟器运行的.其实我们可以利用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

12.打包以后的库文件,我们查看信息

然后打入如下命令:lipo -info /Users/pjk1129/Desktop/libPrint.a 

可以看到如下信息:

如上,你已经看到了,它具备了i386和arm7的条件。 现在我们这个静态库,支持的构架已经是armv7 i386了。

13.ok,经过上述步骤后

这个通用库生成后,我们将原来,调用这个库进行替换一下,在进行编译,成功编译,运行结果如下所示

参考:http://blog.163.com/const_yixinyiyi/blog/static/180088172201211113333882/

转载于:https://www.cnblogs.com/rankilau/p/4363420.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30751947/article/details/95911125

智能推荐

android 蓝牙beacon,bluetooth - Android Beacon Library for EddyStone beacons - Stack Overflow-程序员宅基地

文章浏览阅读229次。I am new to scanning beacons using Android. I am using Library mentioned above, which is easy enough to understand. The reference application works and detects my Eddystone beacons. Based on the sampl..._bluetoothlescanner: could not find callback wrapper

【转载】基于JavaScript在线头像图片编辑前端后台实现-程序员宅基地

文章浏览阅读554次。为什么80%的码农都做不了架构师?>>> ..._修改用户头像后并将地址存入数据库的前后端代码js

SSO单点登录系统原理分析及功能实现_登录系统一般 叫什么-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏5次。Sso系统分析什么是sso系统SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。 为什么要有单点登录系统传统的登录实现方式 此方式在只有一个web工程时是没有问题。 集群环境下 ..._登录系统一般 叫什么

android如何获取屏幕宽度和高度_windowmanager获取屏幕宽度不对-程序员宅基地

文章浏览阅读1.6k次。android获取屏幕的宽度和高度用到了WindowManager这个类,下面介绍如何获取屏幕的宽度和高度 1、WindowManager windowManager = (WindowManager) getContext() .getSystemService(Context.WINDOW_SERVICE); int width = windowManager.getD_windowmanager获取屏幕宽度不对

大一新生HTML期末作业个人介绍博客 使用html+css+javascript+jquery技术制作网页,含有动画,hover效果,含有表格布局_jquery网页期末作业-程序员宅基地

文章浏览阅读278次。个人网页设计、‍♂️个人简历制作、简单静态HTML个人网页作品、个人介绍网站模板 、等网站的设计与制作。个人网页设计网站模板采用DIV CSS布局制作,网页作品有多个页面,如 :个人介绍(文字页面)、我的作品(图片列表)、个人技能(图文页面)、在线留言(表单页面)CSS样式方面网页整体采用左右布局结构,制作了网页背景图片,导航区域每个导航背景色不同,导航背景色与页面背景呼应。 一套A+的网页应该包含 (具体可根据个人要求而定)网站布局方面:计划采用目前主流的、能兼容各大......_jquery网页期末作业

地形鞍部提取_提取鞍部点-程序员宅基地

文章浏览阅读4.5k次,点赞9次,收藏36次。1 流程图 利用水文分析提取山脊线及山谷线,山脊线相当于分水线,山谷线相当于山谷线。分水线是水流的起源点,这些栅格的水流方向只存在流出方向而不存在流入方向,所以汇流累积量为零。通过对零值的提取就可以得到山脊线。 山谷线相当于汇水线要用反地形求出,即用较大值减去DEM,DEM中山脊线就成为山谷线,山谷线变为山脊线,用求山脊线的方法求出山谷线,分别利用正反地形求交验证。 DEM进行填洼,利用水文分_提取鞍部点

随便推点

FreeRTOS Task && Scheduler API_xtaskcallapplicationtaskhook-程序员宅基地

文章浏览阅读245次。FreeRTOS Task && Scheduler API 函数总结_xtaskcallapplicationtaskhook

hdu_4718_The LCIS on the Tree(树链剖分+线段树合并)-程序员宅基地

文章浏览阅读519次。题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4718题意:给你一棵树,每个节点有一个值,然后任给树上的两点,问这两点的最长连续递增区间是多少题解:先树链剖分,然后结合线段树的区间合并来搞,注意的是要记录递增和递减两个状态,因为线段树的区间都是从根到子节点,如果询问从子节点到子节点,那么就是一增一减#include#include#d_树链剖分+线段树合并

语义分割--(SCNN)Spatial As Deep: Spatial CNN for Traffic Scene Understanding_scnn 语义分割-程序员宅基地

文章浏览阅读1.9w次,点赞13次,收藏60次。SCNNSpatial As Deep: Spatial CNN for Traffic Scene Understanding收录:AAAI2018 (AAAI Conference on Artificial Intelligence) 原文地址:SCNN论文提出了一个新颖网络Spatial CNN,在图片的行和列上做信息传递。可以有效的识别强先验结构的目标。论文提出了一个大型..._scnn 语义分割

Java集合框架源码解析之HashSet-程序员宅基地

文章浏览阅读75次。HashSet 实现了 Set 接口,不允许插入重复的元素,允许包含 null 元素,且不保证元素迭代顺序,特别是不保证该顺序恒久不变HashSet 的代码十分简单,去掉注释后的代码不到两百行。HashSet 底层是通过 HashMap 来实现的,如果看过我上一篇关于 HashMap 源码的解析,再来看 HashSet 就会有一种“不过如此”的感觉了在向 HashSet 添加元素时,HashS..._save the state of this hashset instance to a stream (that is, * ser

高通对8916/8939平台出现的死机重启问题的解决方法_msm8909异常重启-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏4次。Question: Normally , when meet a crash, but from dump, can not find any clue, how to handle it?like unknown reset/dog bite/memory corrupt/bit flip crash.Answer: There maybe many crash that are unknown dog bite/reset, or looks like random memory corrupt,_msm8909异常重启

Ant Design Charts绘制中国地图并动态添加标记点_antd 地图-程序员宅基地

文章浏览阅读2.8k次。Ant Design Charts绘制中国地图并动态添加标记点_antd 地图

推荐文章

热门文章

相关标签