热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

xcode创建静态库1

bi首先声明啊,创建静态库的流程我是参考这里的说明做的,让我惊喜的而是竟然成功了,教程里面的都能重现出来,要知道,遇上好多照着教程做,然后结果不一样的情况可是多了去了。而且,这篇教

bi首先声明啊,创建静态库的流程我是参考 这里 的说明做的,让我惊喜的而是竟然成功了,教程里面的都能重现出来,要知道,遇上好多照着教程做,然后结果不一样的情况可是多了去了。而且,这篇教程图文并茂,甚至还有gif示例,卧槽,还能再贴心点吗,这种传播和共享知识的态度简直让我肃然起敬,人家那根本就不是糊弄,而是真正的是想共享一些知识,生怕你哪里看不懂或是漏看了。啥也不说了, 我得作为榜样学习。我在这篇文章所做的就是记录自己学习创建库的过程,以备后用。

进入正题。

首先是要创建一个静态库。库,这个东西大家都知道,轮子嘛,原文中也说了,对于程序员来说,为了能活的更好些,最好还是尽量使用现成的库吧。

创建一个Cocoa Touch Static Library工程
这里写图片描述
之前使用的都是第1个Single View Application,这次也终于换换了。
然后使用RWUIControls作为Product Name创建一个工程。
这里写图片描述

之后选择保存的路径
这里写图片描述

此时,系统默认给添加了两个文件:RWUIControls.m和RWUIContorl.h
这里写图片描述

然后原文中说,此时不需要RWUIControls.m这个实现文件,为什么不需要?可能是因为目前只是一个演示流程,为了简化,我是这么想的。点击右键把它删掉,然后会提示是删除索引呢,还是移到垃圾桶呢?别想了,直接垃圾桶吧,教程说的。

然后编辑一下RWUIControls.h这个文件。把下面这句加进去并替换原来的内容:

#import 

库本身将会用到这个UIKit.h文件。
在添加这句时突然发现,删掉了RWUIControls.m文件后,RWUIControls.h中没有高亮了。而且代码也不会自动补齐了。
这里写图片描述

此时,原文中遇到一个词 unmbrella header file,一开始没懂,什么伞头文件,查了一下,原来是这个文件里面会包含其它众多文件,导入这一个文件就相当于导入了:

#import 
#import
#import
#import
...

这些文件。相当于头文件的综合吧,容易分类,使用起来整洁,一直也是这么用的,但是没有听过说unmbrella header file这个词,现在知道了。

好了,继续。
我正在创建的这个RWUIControls库是依赖于UIKit的,但是,xcode默认的设置是没有引用链接到它的,所以就需要我手动来添加一个这个依赖关系。接下来的操作也是我目前没有做过的,当然了,我在写这篇日记之前已经按照教程做过一遍了,我说的没做过是指在这之前没有做过,我发现我的废话好像是太多了。是不是打字发帖不要钱啊。

我刚才犹豫了一下,这个操作的过程还要不要贴图,原文中甚至在这部分添加了gif动态图。此时我有点嫌麻烦了,我要是也做个gif的图,还得录像,然后上传,得嘞,我也做,从一点一滴开始。顺便加深印象。
这里写图片描述

现在突然反应过来,其实这里操作的就是如何添加一个依赖的库,后面在创建完framework时也会说到如何使用这个framework,和这里的操作差不多,都是这样添加的。

接下来是要记录如何把静态库的头文件导出给别人用。
这一步需要在Build Phases 中添加一个选项,具体操作如下:

选择 Editor\Add Build Phase\Add Copy Headers Build Phase.
有时可能会遇到菜单项为灰色不可选,这时需要在空白区域点一下鼠标改变当前的焦点,然后再选。当时我就没注意这段描述,找了好半天才找到解决方法,不仔细看文档真的会害死猫。
这里写图片描述

接下来就是把需要导出的头文件,从project navigator中拽到刚刚新建的选项中的pubulic中:
这里写图片描述

此时需要注意,在Public中的头文件所包含的头文件也需要一起Public出来,否则别人用的时候会出现错误,找不到文件啊。原文中,当别人用你的库提示找不到头文件,然后你告诉他你忘了导出了,这一点也不好玩。

现在知道为什么刚才创建静态库时删掉RWUIControls.m了,因为这个静态库是想把RWUIControls.h作为库的头文件导出,实际的实现内容由其他代码完成。

这篇例程还提供了对应的源码,此时需要把对应的源文件添加到Project中去,由于本文的目的是记录创建库的流程,而不是创建库的实际内容,所以直接使用了原文提供的源码。

接下来是把 RWKnobControl 这个目录直接拽到 Project Navigator中的 RWUIControls 组里去。

然后会如下图示,按照图中的选项即可。
这里写图片描述
我好像记录过这里的选项有什么区别。 看这里

接下来就会把RWKnobControl加到 RWUIControls这个target里面去,最开始我认为把代码拖进到Project Navigator之后就已经自动添加到项目中了,其实不完全是,是需要特别指定一下的。

这样设置完之后会发现,Headers 里面有些变化
这里写图片描述

头文件自动的到Project里面去了。
这里解释一下Public ,private,project。
首先,Public才是我们想要的,公开的嘛
Private,也是公开的,但不知道有啥区别,反正从名字上很迷惑人。比较遗憾的是,原文并未解释Private与Public到底有哪些区别,我在网上查了一下,原来也有好多人不明白,说实话,我现在也不是很明白。有人解释说放在Private中的文件客户可见,是文件名可见?我也不知道,但是他们用不了,这是在什么情况下使用的还不得而知。参考链接
现在接着说,下一步需要把Project中的RWKnobcontrol.h这个文件拽到Public中去,把它导出,好给别人用,别人能看也能用。还有一个方法就是在Project Navigator中点击需要移动的文件,然后在xcode的右侧File inspector中找到Target membership,如下图:
这里写图片描述

点击右下角的Project,选择里面的Public,就把这个文件移到Public组中去了。

原文中提示,尽可能保持Pulbic中的文件少,够用合理就行,这个要求得自己拿捏,其他的都放在Project中。

接下来要做的就是要让用户只include一个头文件就能使用我们的库就行了,如下使用:

#import 

很简洁是不是?为了达到这个目的,此处需要把RWKnobcontrol.h添加进RWUIControl.h中去,如下:

// Knob Control
#import

卧槽,我刚才写的都没了??!!

不说废话了,直接写入正题吧。

接下来需要把库文件和头文件打个包儿,这样方便发布,总不能一个一个的把这些文件发给别人使用吧。

打包的工程见下图操作:

这里写图片描述

先点击Project Navigator中的Project,然后点击TARGETS中的RWUIControls,接着选择Build Settings标签,搜索public header,然后双击Public Headers Folder Path,在弹出的文本框中输入

include/$(PROJECT_NAME)

PROJECT_NAME是一个变量,输入完之后按下回车将会看到这个变量的值。

接下来还要再做一些其他的设置。这些设置包括如下方面:
1.编译器有一个将dead code移除的功能选项,啥是dead code?就是永远不会执行的代码。
2.移除调试信息,也就是函数名,和其他的有关调试细节的信息。

考虑到我正在创建一个framework给别人用,所以,我最好默认的把这些都禁用了,然后让用户自己选择是否打开。
除了上面提到的几点外,还有如下几点:
Dead Code Stripping – 设置为 NO
Strip Debug Symbols During Copy – Set this to NO for all configurations
Strip Style – Set this to Non-Global Symbols

设置完这些之后按下Command+B来编译。


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
author-avatar
情系50后_989
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有