5

作为来自 VS 的新 MAC 开发人员,我并没有真正“了解”什么是框架。如果我在我的项目中添加一个框架,这是否自动意味着当我这样做时应该找到标题#include <SomeFile.h>

我似乎发现在某些情况下我也必须添加标题搜索路径。这是否意味着框架无法正常工作?

4

2 回答 2

4

根据Apple 概念文档的定义:

框架是一个分层目录,将共享资源(如动态共享库、nib 文件、图像文件、本地化字符串、头文件和参考文档)封装在一个包中。

换句话说,它是一个或多个应用程序可以使用的资源的汇编,它本身并不是一个应用程序。

Apple 概念文档详细说明:

您可以使用该#include 指令在代码中包含框架头文件。如果你在 Objective-C 中工作,你可以使用 #import指令而不是#include指令。这两个指令具有相同的基本结果。但该#import指令保证同一个头文件永远不会被包含超过一次。包含框架头有两种方法:

#include <Framework_name/Header_filename.h>
#import <Framework_name/Header_filename.h>

在这两种情况下,Framework_name是框架的名称,而 Header_filename是该框架或其子框架之一中的头文件的名称。

包含框架头文件时,传统上只包含主框架头文件。主头文件是名称与框架名称匹配的头文件。例如,地址簿框架有一个名为 AddressBook.h.

要包含自定义框架:

如果您的项目链接到的框架不包含在任何标准位置中,则必须在 Xcode 找到其头文件之前显式指定该框架的位置。要指定此类框架的位置,请将包含框架的目录添加到Xcode 项目的“框架搜索路径”选项中。Xcode 将此目录列表传递给编译器和链接器,它们都使用该列表来搜索框架资源。

于 2012-05-19T13:58:10.730 回答
3

如果框架编写得当,它包含标头以及实际的可链接(二进制)文件。编译器(以前是 GCC,最近是 LLVM-clang)识别框架路径并自动知道在哪里搜索框架头文件。但是有一些极端情况:

  1. 如果您不添加框架,而是添加来自 /usr/lib 的传统 Unix 库(libsqlite3.dylib、libxml2.dylib 等)。那么可能是库有一个单独的(非标准)包含路径;这很常见,例如,在 glib 的情况下。在这种情况下,您必须将 /usr/include/glib-2.0 添加到您的标头搜索路径中。
  2. 相反的情况:当你遇到一些“伞”框架时(例如,Core Audio 被拆分成小的子框架,比如 AudioToolbox.framework 等),那么那个特定的框架不包含可链接的动态库,只有标题。

我希望这有帮助。

于 2012-05-19T13:55:29.577 回答