`

iOS开发:xcode4中使用静态库和工作区

 
阅读更多

转自:http://www.cnblogs.com/speeding/archive/2011/09/29/2195252.html

 

在xcode4中,为了将一些比较独立的功能封装起来,或者多人同时开发时,需要将程序打包成静态库,但在xcode4中设置工作区、工程和静态库等遇到了一系列问题,不知道是不是xcode的高版本中已经解决了这些问题?我用的是xcode4.0(4A304a), SDK是4.3。

从网上能够查到的写的比较全面的使用和建立静态库的文章是CarbonFive的这篇文章。但我按照这个文章逐个试验后,发现几个地方跑不通,经过一番尝试,终于在我的机器上把详细的设置步骤跑通了。

更新记录:

2011年9月29日,完成了初稿。

2011年10月30日,更正了目录结构,xcode中Location还是使用默认设置才对。

xcode4中的几个基本概念

工作区(Workspace):在xcode4中引入了这个概念,能够把project统一管理起来,这功能在VisualStudio中是很早就有的功能。

工程(Project):工作区里管理着一些工程,相关的源程序和资源都在这里面。

Scheme:这个概念取代了xcode3中的Active Target, Build Configuration, and Executable settings,具体含义不太了解,但只知道它执行了一组build动作,在xcode的顶端工具条上可以快速切换不同的scheme。

xcode_scheme

构建目标(Target):构建目标指定了一系列的编译和连接设置,对于静态库就是生成一个.a文件。

还有一个group不知道是什么概念,因为在文件的location属性中有个“Relative to Group”设置。

这些一大堆概念到现在还只是略知一二,后面用的多了会理解慢慢深刻一些吧。

生成静态库

在新建工程时,需要选择“cocoa Touch Static Library”这个模板,

template_static

一阵子Next后,可以建出一个工程,我这里取名为testlib。为了测试,我建了一个类MyClass,生成MyClass.h和MyClass.m两个文件。

(1)公开头文件

要选中.h文件,将Target Membership中设置为public。

publicheader[5]

(2)设置安装路径

在testlib的工程设置里面,找到testlib构建目标,在Build Settings中找到"Installation Directory"一项(可设置的项非常多,建议在搜索框中输入install来快速查找定位),填上“$(BUILT_PRODUCTS_DIR)”,将Skip Install设置为Yes。

installDir

$(BUILT_PRODUCTS_DIR)这个环境变量在工作区的build/debug-iphoneos路径下,最好在构建的过程中去打开Finder看看这个目录里有什么变化。

 

(3)设置公开头文件的路径

在英文的那篇博文中说将这里设置为“$(TARGET_NAME)”,是指将生成的头文件放在一个目录中,在本程序中,会在/build/debug-iphoneos/中生成一个testlib目录,在这个目录中有一个文件MyClass.h文件。

targetname

设置完成前面的三步,可以执行Build操作了,如果一切顺利,会在Products中看到libtestlib.a由红变黑了,表示这个文件生成了,点击这个文件可以看到详细信息,如果看不到,就说明哪个设置还是有问题的。

lib.a

下面一步非常关键:

如果有问题,需要在xcode的系统设置中检查Locations设置,在xcode的Preferences…->Locations->Build Location里,选“Place build products in derived data location(recommended)”,设置完成后需重启xcode才能生效!用xcode的这个默认设置,那个.a文件一直放在一个长长的非常难看的路径中(/Users/xxx/Library/Developer/Xcode/DerivedData/xxxProgram-dalrvzehhtesxdfqhxixzafvddwe/Build/Products/Debug-iPhoneos),不知道apple为什么要这样做?是为了支持多个版本的静态库?

 

使用静态库

加上一个工程,我这里命名为mainprog,让它依赖testlib,我在主程序中加了一条#import "MyClass.h"语句,只要这条语句能够编译,整个工作区和工程应该设置的就没问题了。

(1)设置依赖关系

在mainprog工程的build phases中,将libtestlib.a加到link Binary With Libraries中。

link

chooselib

(2)添加静态库的头文件搜索路径

这一步最迷惑人了,先在Build Settings中,将User Header Search Paths设置为“$(BUILT_PRODUCTS_DIR)”。

userheader

然后双击那个显示“<Multiple values>”的地方,弹出一个对话框(这个窗口隐藏的相当深,我找了足足半天才发现,一开始还以为我的xcode版本有点低呢),把Recursive勾上。

recursive

(3)设置Scheme

加上了依赖关系,按照以前VisualStudio的习惯,整个构建过程应该按照这些依赖关系的顺序来构建了吧,可发现xcode现在还没有这么聪明,需要再设置一下scheme,据说(从apple的xcode文档中查的)勾上那个Archive非常重要。

scheme_setting

(4)让自动完成功能正常

待完成。

全部步骤完成了,选择mainprog的scheme,应该能够构建成功了!

补充一下:

那个目录结构也非常重要,用xcode建的工程会多产生出一级目录来,我建一个MyProduct目录,用Finder将工程目录和工作区文件都移到这里面,然后再重新打开工作区,将这些工程重新添加到工作区中,看起来就舒服多了。

2011年10月30日更正:上面所说的目录结构还是有问题的,使用xcode在一开始新建出来的默认结构是正确的,虽然一开始看起来不太习惯,但后来发现它的设置思路还是很清楚的。

MyProgram(工作区目录)
├─Project1(这是一个静态库项目)
│  ├─build
│  │  ├─Debug-iphoneos
│  ├─Project1(这实际是一个分组,源程序应该放在这里)
│  ├─Project1.xcodeproj
│  └─Project1Tests
├─MyProgram.xcworkspace
└─Project2(这是一个iOS项目)
    ├─build
    │  ├─Debug-iphonesimulator
    ├─Project2(这也是一个分组,源程序都在这里)
    │  ├─iPad
    │  └─iPhone
    └─Project2.xcodeproj

虽然探索的过程非常艰苦,还得感谢国外的那个程序员CarbonFive,那篇文章给出了关键的步骤。

------------------------------------------------------------

作者:毒龙的程序人生{speeding} (http://www.cnblogs.com/speeding/) 
版权声明:本文的版权归作者和博客园共有,转载时须注明本文的详细链接,否则作者将保留追究其法律责任。

分享到:
评论

相关推荐

    Xcode编译静态库方法

    本篇文章将深入探讨如何使用Xcode编译静态库,这是iOS开发中常见的需求,尤其是在开发组件化或者第三方库时。 静态库是一种预先编译的代码集合,可以在编译时直接嵌入到应用中,使得应用包含了库的所有代码,不需要...

    StaticLibraryForXcode4AndiOS:Xcode 4和iOS的静态库

    Xcode 4和iOS的静态库 创建静态库是在项目中重用代码的好方法,但是使用Xcode 4,如果您不知道要设置它的以下步骤,则可能很难设置。 而且,如果您的静态库定义了动态的类别,则需要采取额外的步骤来确保您的实现...

    Xcode 的核心观念

    Xcode是苹果公司开发的一款集成开发环境(IDE),专为Mac系统设计,用于开发iOS、macOS、watchOS以及tvOS应用程序。它整合了代码编辑、编译、调试、性能分析和版本控制等功能,是苹果平台开发者不可或缺的工具之一。...

    Xcode 4 Unleashed 2nd Edition

    本书详细介绍了如何快速开始Xcode 4项目工作流,掌握Xcode 4的新功能和开发范式,利用Interface Builder构建现代iOS和Mac用户界面,以及在iOS应用中实现模型-视图-控制器(Model-View-Controller,MVC)设计模式。...

    ios开发图文并茂(UI方面)简单实例

    在iOS开发中,UI设计是至关重要的一环,它关乎到应用程序的用户体验和视觉吸引力。本教程将通过一个在Xcode环境下的简单实例,带你了解如何创建一个图文并茂的用户界面,并实现基本的交互功能。我们将主要关注标签...

    让不懂编程的人爱上iPhone开发(2013秋iOS7版)-第4篇1

    《让不懂编程的人爱上iPhone开发(2013秋iOS7版)-第4篇1》这篇文章是面向初学者介绍如何使用Xcode进行iOS应用开发的教程。本文将深入讲解其中的关键知识点,帮助初学者理解iOS界面构建和Xcode工具的使用。 首先,...

    IOS项目目录结构

    在iOS开发中,项目目录结构的设计对于项目的可维护性、扩展性和团队协作至关重要。"IOS项目目录结构"通常包括多个核心部分,旨在使代码组织有序,便于理解和调试。以下是对这个话题的详细解读: 1. **项目根目录**...

    ios-仿淘宝首页布局.zip

    它们被编译成静态库,方便在项目中使用。 7. **TaoBaoHomeDemo**:这可能是项目的主要源代码目录,包含了实现淘宝首页布局的Swift或Objective-C代码。开发者可能会在这里找到视图控制器、模型、网络请求、布局算法...

    lame-ios-build-master.zip

    这个目录通常会包含预编译的静态库文件和其他必要的资源,如头文件。对于Xcode项目,确保在“Build Phases”部分链接这些库,并在“Build Settings”中设置正确的搜索路径,以便编译器能找到LAME的相关头文件。 在...

    基于Objective-C开发的新闻客户端App.zip

    - **.xcworkspace**: Xcode的工作区文件,包含了项目的配置信息。 - **.h/.m files**: Objective-C的头文件和实现文件,定义了类和方法。 - **.swift files**: 如果项目混合使用Swift,这些是Swift语言的源代码文件...

    swift-Signal是一个iOS消息应用用于与朋友进行简单的私人通信

    7. **xcworkspace**: Xcode的工作区文件,包含了项目的配置和依赖关系,用于在Xcode中打开和编译项目。 通过深入研究这个开源项目,开发者可以学习到如何在Swift中实现端到端加密、如何处理网络请求、以及如何优化...

    Core Data by Tutorials v4.0 Source Code (Swift4)

    4. **托管对象上下文(Managed Object Context,MOC)**:是Core Data的主要工作区,用于创建、修改和删除实体实例。所有对数据库的更改都必须通过MOC进行。 5. **托管对象模型(Managed Object Model,MOM)**:...

    iOS-PLC:使用Snap7的适用于iOS的Siemens Simatic S7通信软件

    首先,你需要获取Snap7源代码并将其编译为适用于iOS架构的静态库。这可能涉及到使用Xcode的构建系统或第三方工具如CMake。确保为所有必要的iOS设备架构(armv7, arm64, i386, x86_64)构建库。 2. **设置桥接头** ...

    PjSIP:该项目构建了一个提供 sip 连接功能的 iOS 静态库。 它公开了 DXIPJSipManager 类,该类可用于将 iOS 应用程序连接到 sip 服务器

    该项目构建了一个提供 sip 连接功能的 iOS 静态库。 它公开了 DXIPJSipManager 类,该类可用于将 iOS 应用程序连接到 sip 服务器。 1 - 添加到项目 #####a) 添加 pspip-ios 作为子模块 打开终端并导航到您的项目...

    kotlin_multiplatform:带有iOS和Android项目的通用本机Kotlin库

    对于iOS部分,项目会包含一个Xcode工作区,其中包含一个CocoaPods或Carthage集成的Kotlin/Native目标。Kotlin/Native是Kotlin Multiplatform的一部分,它允许编译Kotlin代码为原生iOS二进制文件。在iOS项目中,你...

    VKApp-无故事板

    5. `.xcworkspace`:Xcode的工作区文件,用于打开和管理项目及其依赖。 6. `.gitignore`:指定Git应忽略的文件或文件夹。 7. `LICENSE`:项目许可文件,描述了项目的授权方式。 通过这个项目,开发者可以学习到...

    eXploit

    Objective-C是苹果平台(如iOS和macOS)的主要开发语言,它在C语言的基础上添加了面向对象的功能和Smalltalk的特性。 Objective-C的安全性对于构建安全的苹果应用程序至关重要。由于Objective-C的动态特性,它可能...

Global site tag (gtag.js) - Google Analytics