Xcode WorkSpace含静态库多项目依赖编译
2016-01-11 00:00
246 查看
摘要: 本文介绍了如何在Xcode5中使用Workspace管理多个project,如何构建静态链接库.a,如何进行依赖管理和依赖编译。
一般的某个应用单独新建一个 project 就可以了,然后把所有的程序文件都放在里面,这个可以满足大部分普通的需求,但是有时候,项目有可能要使用其他的项目文件,或者引入其他的静态库文件,这个时候 workspace 就派上用场了,workspace 即可以单独管理多个项目,又可以通过配置,让各个项目相互依赖,如果不用 workspace,以前的做法是如果用到其他项目的文件,要手动 copy 文件到当前的项目,在 workspace 里这个步骤不需要了。
1、新建 Xcode workspace
打开 Xcode , 选择 File -> New -> Workspace , 将 Workspace 命名为 Test.xcworkspace , 并选择合适的目录。
2、设置编译文件输出路径。
打开Xcode-Preferences,选中Location标签页,设置Derived Data为Relative,点击Advanced进入高级设置,选中Custom,选中Relative to Workspace。这样,在workspace的Build-Products文件夹下可以找到编译生成的目标文件了。
3、新建 Static Library 项目
选择 File -> New -> Project , 项目模板选择 Cocoa Touch Static Library , 项目名称命名为 MyLib.xcodeproj , 注意选中 Use Automatic Reference Counting 。
Xcode 会在项目中自动生成 MyLib.h 和 MyLib.m 文件, 单击 MyLib.h 文件, 添加下面的方法定义:
+ (NSString*)getMyTag;
再打开 MyLib.m 文件, 添加刚刚定义两个文件的实现:
+ (NSString*)getMyTag{
return @"MyLib";
}
MyLib 项目, 在中间的编辑器窗口中选择项目的 Target , 选择 Build Phases 标签, 展开 Copy Headers 分组, 下面有三个子分组, 分别是 Public 、 Project 与 Private , 将 MyLib.h 拖拽到 Public 分组即可。
选中
保存所有文件, 选择 Product -> Build , 进行编译, 生成 libMyLib.a 文件, 同时也会自动将 MyLib.h 文件复制到输出目录(workspace下的Build-Products文件夹)。
4、使用静态类库项目
选择 File -> New -> Project , 项目模板选择 iOS -> Application -> Single View Application , 项目名称命名为 MyApp , 注意勾选 Use Storyboards 和 Use Automatic Reference Counting 。
建好项目之后, 项目窗口如下如所示:
选中 MyApp 项目, 在选择项目的目标 (Target) , 选中 Summary 标签页下找到 Linked Frameworks and Library 分组选项, 如下图:
点击下面的加号按钮, 将工作区的 libMyLib.a 添加进去。
接下来设置头文件搜索路径User Header Search Paths为$(BUILT_PRODUCTS_DIR),勾选递归搜索选项recursive,如下图。设置完成,即可直接引用头文件,#import "Mylib.h".
5、配置工程的编译选项,控制编译工程之间的依赖关系。
在,MyApp的 scheme manage里面添加之前建立的lib文件,编译MyApp的时候,就会先编译 statib lib的内容,然后再编译自身工程。
6、现在要先验证一下对 MyLib 的引用是否正确, 打开 MyApp 项目的 ViewController.m , 添加对 MyLib.h 的引用, 如下图所示, 并编译 MyApp , 如果编译成功, 则表示引用正确。
7、打开 ViewController.m 文件,调用MyLib的静态方法getMyTag,输入返回结果,得到“MyLib“输出日志。
Bundle打包和集成
workSpace中的Bundle类型target不能自动引用,需要手动加入子项目中的目标bundle(注意为workSpace相对路径)
另外一种办法是使用脚本拷贝到指定目录,未使用,不做详述。
头文件的问题
子项目的.a文件默认放在$(BUILT_PRODUCTS_DIR)下(Debug-iphoneos,Relese-iphoneos),
头文件默认放在$(BUILT_PRODUCTS_DIR)/include/$(PRODUCT_NAME)目录下,
这样头文件就有两份,在不同的目录下,都是在*-iphoneos目录下,而User Head Search Path设置为$(BUILT_PRODUCTS_DIR),在切换iphonesimulater编译时,就无法搜索到头文件。
(.a文件的引用由workspace自动管理的,没有这问题)
解决办法:
1、首先修改头文件copy路径,原为:/include/$(PRODUCT_NAME),修改为:../include/$(PRODUCT_NAME)
2、User Head Search Path设置为$(BUILD_DIR)/include,勾选recursive循环搜索,Always Search User Path设置为YES。
OK,这样就可以随心所欲的选择iphoneos和iphonesimulater进行构建。
一般的某个应用单独新建一个 project 就可以了,然后把所有的程序文件都放在里面,这个可以满足大部分普通的需求,但是有时候,项目有可能要使用其他的项目文件,或者引入其他的静态库文件,这个时候 workspace 就派上用场了,workspace 即可以单独管理多个项目,又可以通过配置,让各个项目相互依赖,如果不用 workspace,以前的做法是如果用到其他项目的文件,要手动 copy 文件到当前的项目,在 workspace 里这个步骤不需要了。
1、新建 Xcode workspace
打开 Xcode , 选择 File -> New -> Workspace , 将 Workspace 命名为 Test.xcworkspace , 并选择合适的目录。
2、设置编译文件输出路径。
打开Xcode-Preferences,选中Location标签页,设置Derived Data为Relative,点击Advanced进入高级设置,选中Custom,选中Relative to Workspace。这样,在workspace的Build-Products文件夹下可以找到编译生成的目标文件了。
3、新建 Static Library 项目
选择 File -> New -> Project , 项目模板选择 Cocoa Touch Static Library , 项目名称命名为 MyLib.xcodeproj , 注意选中 Use Automatic Reference Counting 。
Xcode 会在项目中自动生成 MyLib.h 和 MyLib.m 文件, 单击 MyLib.h 文件, 添加下面的方法定义:
+ (NSString*)getMyTag;
再打开 MyLib.m 文件, 添加刚刚定义两个文件的实现:
+ (NSString*)getMyTag{
return @"MyLib";
}
MyLib 项目, 在中间的编辑器窗口中选择项目的 Target , 选择 Build Phases 标签, 展开 Copy Headers 分组, 下面有三个子分组, 分别是 Public 、 Project 与 Private , 将 MyLib.h 拖拽到 Public 分组即可。
选中
保存所有文件, 选择 Product -> Build , 进行编译, 生成 libMyLib.a 文件, 同时也会自动将 MyLib.h 文件复制到输出目录(workspace下的Build-Products文件夹)。
4、使用静态类库项目
选择 File -> New -> Project , 项目模板选择 iOS -> Application -> Single View Application , 项目名称命名为 MyApp , 注意勾选 Use Storyboards 和 Use Automatic Reference Counting 。
建好项目之后, 项目窗口如下如所示:
选中 MyApp 项目, 在选择项目的目标 (Target) , 选中 Summary 标签页下找到 Linked Frameworks and Library 分组选项, 如下图:
点击下面的加号按钮, 将工作区的 libMyLib.a 添加进去。
接下来设置头文件搜索路径User Header Search Paths为$(BUILT_PRODUCTS_DIR),勾选递归搜索选项recursive,如下图。设置完成,即可直接引用头文件,#import "Mylib.h".
5、配置工程的编译选项,控制编译工程之间的依赖关系。
在,MyApp的 scheme manage里面添加之前建立的lib文件,编译MyApp的时候,就会先编译 statib lib的内容,然后再编译自身工程。
6、现在要先验证一下对 MyLib 的引用是否正确, 打开 MyApp 项目的 ViewController.m , 添加对 MyLib.h 的引用, 如下图所示, 并编译 MyApp , 如果编译成功, 则表示引用正确。
7、打开 ViewController.m 文件,调用MyLib的静态方法getMyTag,输入返回结果,得到“MyLib“输出日志。
Bundle打包和集成
workSpace中的Bundle类型target不能自动引用,需要手动加入子项目中的目标bundle(注意为workSpace相对路径)
另外一种办法是使用脚本拷贝到指定目录,未使用,不做详述。
头文件的问题
子项目的.a文件默认放在$(BUILT_PRODUCTS_DIR)下(Debug-iphoneos,Relese-iphoneos),
头文件默认放在$(BUILT_PRODUCTS_DIR)/include/$(PRODUCT_NAME)目录下,
这样头文件就有两份,在不同的目录下,都是在*-iphoneos目录下,而User Head Search Path设置为$(BUILT_PRODUCTS_DIR),在切换iphonesimulater编译时,就无法搜索到头文件。
(.a文件的引用由workspace自动管理的,没有这问题)
解决办法:
1、首先修改头文件copy路径,原为:/include/$(PRODUCT_NAME),修改为:../include/$(PRODUCT_NAME)
2、User Head Search Path设置为$(BUILD_DIR)/include,勾选recursive循环搜索,Always Search User Path设置为YES。
OK,这样就可以随心所欲的选择iphoneos和iphonesimulater进行构建。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 深入探讨Linux静态库与动态库的详解(一看就懂)
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- linux生成(加载)动态库静态库和加载示例方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法