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

xcode编译静态库所要注意

一建立静态库1.生成静态库工程2.releasedebug的选择scheme3.编译(注意真机与模拟器的产物)》lipo-create【源文件路径1】【


一 建立静态库
1. 生成静态库工程
2. release/debug 的选择  scheme
3. 编译(注意真机与模拟器的产物)==》
 lipo -create 【源文件路径1】  【源文件路径2】  -output 【目标文件】


二  使用
1. 插入.h(头文件引用,静态库不自包含头文件)和.a文件(静态库)

 

三 如果是再workspace中进行连编调试,补充如下
静态库工程(build setting)设置
1) 生成产品的路径
 1.1 Installation Directory 设为  $(BUILT_PRODUCTS_DIR) //生成产品的路径
 1.2 Skip Install 改为 yes
2) 设置公开的头文件
 要选中.h文件,将Target Membership中设置为public。
3) 设置公开头文件的路径
 public headers folfer path 设为 $(TARGET_NAME)  //项目名作为头文件存放路径
使用工程设置
1) 添加静态库的头文件搜索路径
 将User Header Search Paths设置为“$(BUILT_PRODUCTS_DIR)“ //其实这个工作区的产品都在一个共同的根目录下
2)  设置scheme依赖关系
3) 如果要单独使用,拷贝出头文件即可!

四 注意事项
1. 如果静态库中存在Objective-C风格的类文件,需要在build-setting中的Other linker flags中加上-ObjC,如果存在Category,还应加上-all_load或-force_load。

2. 隐藏静态库代码

直接删除静态库中的源代码,只提交链接库文件(.a),这样原项目仍然可以编译执行。

 

五 XCode项目中添加静态库的方法


  1. 右击target,选择add -> newtarget 
  2. 在弹出的 NewTarget 界面中选择Cocoa Touch -> StaticLibrary ,为新 library 取个名字。
  3. 将源文件添加到这个库。可以直接拖动现存源文件,也可以右击 -> add。注意选择新建的库为添加的 target 。
  4. 设置原项目,令其使用新建的库。 (设置源文件不参加编译)
  5. 编译新建的静态库以产生 .a 文件。(右击静态库的 target ,选择build)
  6. 编译原项目,若可以调用静态库中的方法则添加成功。

网上有很多关于xcode制作第三方库的教程,我就不再记录,这里说一说我在制作静态库中遇到的问题,以及解决办法。


问题一: 静态库.a文件始终为红色,显示编译不成功。


解决办法:这是xcode的一个bug,先将编译模式设置为device,编译成功,再切换回simulator模式即可编译simulator对应的.a文件,路径为

/Users/${user_name}/Library/Developer/Xcode/DerivedData/${product_name} -aurdmbdevpxznmgvgvihwjqairej/Build/Products/Debug-iphonesimulator /libxxx.a
真机对应的.a文件在Debug-iphoneos /libxxx.a

问题二:静态库中使用了category扩展,引用静态库的工程找不到扩展的方法,报错

原因:这也是xcode的bug。。Objective-C不会为每一个objc函数生成链接符号,而是会为每一个类生成链接符号。通过category对一个已有的类进行扩展,那么链接器就不知道如何把原代码与category的代码实现关联起来,导致生成的对象无法响应属于category的消息。


解决办法:1、build settings中的Other Linker Flags添加-Objc选项。这个选项会促使链接器加载库中所有定义了Class和Category的文件。但这些额外的代码会使目标文件变大。但在64位和iOS应用程序中,linker有一个bug,这个bug会导致objc选项无效,无法从静态库中加载只定义了Category的文件 ,这就需要添加-all_load或-force_load选项。


2、网上搜了一圈,说还有更好的办法解决,来自于Three20的源代码。解决办法如下:

/**
* Add this macro before each category implementation, so we don't have to use
* -all_load or -force_load to load object files from static libraries that only contain
* categories and no classes.
* See http://developer.apple.com/library/mac/#qa/qa2006/qa1490.html for more info.
*/
#define TT_FIX_CATEGORY_BUG(name) @interface TT_FIX_CATEGORY_BUG_##name @end \
@implementation TT_FIX_CATEGORY_BUG_##name @end
意思是定义一个空的class,使得包含该空class的文件能被加载,我试了试,仍然报错。。。只有先使用-force_load了哭
摘自;http://blog.csdn.net/sclzcq/article/details/8330837






升级到Xcode4.5之后,新增了iPhone5的armv7s支持,但是去除了armv6的支持,也就是说用XCode4.5无论如何配置项目都是无法编译出能在iPhone3G、iTouch2上面运行的程序或者库文件的,
参见《xcode4.5下编译出包含armv6架构的静态库》:http://blog.yorkgu.me/2012/10/17/build-static-libs-for-armv6-with-xcode-4-5/



推荐阅读
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • 本文介绍了某点评网的搜索策略,包括名称和地址的匹配策略,模糊匹配的方法以及不同口音和拼音的近似发音。同时提供了一些例子来说明这些策略的应用。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • imnewtotheswiftandxcodeworld,soimhavingaproblemtryingtointegrateapackagetomypro ... [详细]
  • iOS开发Debug和Release的理解
    2019独角兽企业重金招聘Python工程师标准参考:http:blog.csdn.netmad1989articledetails406580331&# ... [详细]
author-avatar
温暖不醒的aprildRi-1965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有