在我的 XCode 4.5 项目中对以红色显示的框架进行故障排除

Posted

技术标签:

【中文标题】在我的 XCode 4.5 项目中对以红色显示的框架进行故障排除【英文标题】:Troubleshooting a framework which appears in red in my project in XCode 4.5 【发布时间】:2013-01-22 16:18:09 【问题描述】:

在构建任何 Mac OS X 应用程序时,该应用程序使用未内置于核心的任何框架,即一些第三方框架,当我遇到框架显示为红色的问题时,这似乎很常见。在 XCode 4.5 中查看它。

有两个最常见的地方可以显示为红色,一个在项目导航器窗格(左侧)中,一个在构建阶段区域。第三个位置,在 Copy Files 区域,通常显示为红色。这三个都有不同的原因。

这三个地方都显示为红色时的样子:

我们中间观察者的线索:红色部分后面的一些灰色文本表明 XCode 可能错误地在 XCode.app 包中寻找有问题的框架。另请注意,显示的框架没有任何框架图标,仅显示上图中无效框架的占位符图标。

如果根本找不到框架,那么在我构建时,无法导入框架的头文件,所以我得到一个“词法或预处理器问题”。解决方案通常是修复框架搜索路径。然而,即使这似乎是正确的,我仍然经常得到红色框架。

有时,图标是红色的,但框架搜索路径运行良好,编译工作正常(#import <Thingy/Thingy.h> 工作正常,我没有得到任何词法或预处理器问题),但项目赢了'不链接或运行时崩溃,因为框架在编译阶段被准确引用,但不是在链接或不是在复制文件阶段。

如果 XCode 无法导入框架内的头文件,下面是一个示例:

这个问题应该是一般性,并且对将来在框架列表中看到“红色”框架的任何人都有用。是的,我已经向供应商寻求有关他们框架的帮助,这应该是第一步。但是,我觉得“XCode 以红色显示框架”令人困惑,它值得一个普遍有用的答案,因此这个问题。另外,我有理由相信,在这种情况下,供应商的安装程序工作得很好,这是我机器上的一个本地问题,其他人将来可能会遇到并且可能希望帮助理解和修复。

扯完头发后,我发现我可以通过将红色显示的框架复制到/Applications/Xcode.app/Contents/Developer/Library/Frameworks 中以非常糟糕的方式解决这个问题,但这可能不是正确的方法。这样做似乎是错误的。如果我将位于 /Developer/VendorName 中的框架复制到 xcode 应用程序包的库/框架中,我可以避免编译器找不到框架。

第三方框架当前自动安装到/Developer 下的文件夹中,该文件夹以制造框架的公司命名。 XCode 是否应该自动搜索 /Developer 下的所有文件夹并以某种方式找到这些框架? 目前我在猜测,不,它不能,所以 XCode 可能每次都必须被告知找到这个第三方框架的确切路径

我无法找到有关“Xcode 如何查找框架”的 Apple 文档。有一个问题here 就是这么问的,但答案都与 GCC 标头搜索路径有关,而不是 Xcode 如何查找框架和构建该搜索路径。

XCode 4.5 搜索哪些文件夹来定位库?即使 XCode 4.5 本身不再位于 /Developer 中,是否仍会搜索 /Developer 文件夹?

当要安装第三方框架以供 Mac OS X 客户端使用时,应该将其安装到哪里,以及如何检查安装程序是否正常工作?是否有一些命令行调用可以列出 XCode 可见并安装在我的系统上的所有可用框架?

脚注: 第二种工作方式是使用“添加其他”按钮来查找不在已知位置的框架,如果我使用它,那么我经常会遇到一个构建的项目,但在运行时仍然失败,因为复制文件功能没有找到和复制东西,因为使用加号按钮将框架添加到复制阶段似乎在 XCode 中被破坏了。不过有一个解决方法。我最初问的是如何工作,这样您就不需要使用 Add Other,但是,如果 Add Other 是第三方框架的唯一方法,那么,我仍然会遇到 Copy Files 功能无法正常工作的问题。我相信解决这个问题的方法是 XCode 项目自己的框架搜索路径没有为我的系统正确设置,这就是我需要做的所有事情来解决这个特殊情况。简而言之,我想知道全局“框架搜索路径”是什么,它在哪里设置?还是只有 XCode 项目搜索路径,而不是全局框架搜索路径?如果我清理了 Framework 搜索路径,然后使用 Add Other 添加了新的框架,并小心地右键单击并从项目导航器窗格中删除所有 Red 项,如果我只使用鼠标拖放而不使用+ 按钮将框架添加到复制文件中,然后我可以在私有搜索路径位置获取框架来构建和复制。任何尝试使用 Copy Files 区域中的 + 按钮,并通过该对话框添加框架似乎都被某种奇怪的 XCode 错误阻止,在错误的位置添加框架,如第一张图片所示上面,它错误地记住或缓存了第三方框架应该位于 XCode.app 包内的 Developer/Library/Frameworks 文件夹中。

【问题讨论】:

【参考方案1】:

是的,这是一个很好的问题。我一直想来就一个相关问题发表一篇文章:为静态库项目创建一个包,其中包含一个已编译的 momd 文件我只能通过使用该包将库项目嵌套在项目下才能开始工作。也就是说,嵌套在 Xcode 中,在文件系统级别它仍然显示为对等点。这与项目如何找到其他项目的产品有关。

同时,在您的具体问题上,我多年来在每个项目中都使用了 OCHamcrest,除非我在项目中实际安装框架文件,否则我一直无法让它可靠地工作。理想情况下,我想将 OCHamcrest 安装在 /Library/Developer/Frameworks 之类的位置之一,但尝试完成这项工作非常痛苦,简直是疯了。

我已阅读有关 Xcode 在何处查找框架的文档,它位于 /Developer/Library/Frameworks 和 /Library/Frameworks 中。如果你往里看,你只会看到苹果的东西。另外,请记住 /Developer 曾经是一个单独的目录,直到 Xcode 4,所以它看起来并不那么愚蠢。现在,如果你决定去使用测试版,你会被搞砸的。我很确定当 Xcode 4.5 自我更新时,在应用程序中,它会复制框架。

我希望有人有更好的想法!

【讨论】:

供应商的一位友好且非常聪明的超级好人(在我的例子中是 RemObjects)告诉我,XCode 4.5 仍然可以在硬盘根目录下的旧 /Developer 中找到框架,即使 XCode 内置Cocoa 等的 -in 框架现在位于 XCode.App 包中。 啊,好吧,那很好。我会尝试一下!在 Java 世界中使用 Maven 多年后,我认为再次手动管理框架和库将是一场噩梦。它真的没有那么糟糕,并且可以通过更多的调整变得真正无痛。 好吧,它应该可以工作,这对我来说是一种冷酷的安慰,因为我仍然无法让它工作! 哦,好的,将尝试在此处发布。我想将我的 TDD 框架安装在一个地方。 到目前为止,据我所知,这在逐个项目的基础上是可能的,使用项目级别的框架搜索路径,但不是全局的。【参考方案2】:

当我在 Xcode 项目中使用第三方框架时,对我有用的是在我的 Mac 上的 /Library/Frameworks 中安装框架,并按照您在脚注中描述的方式添加它们。如果项目构建失败,将 /Library/Frameworks 的搜索路径添加到框架搜索路径构建设置通常足以让项目构建。

如果您将框架复制到您的应用程序包并且复制不起作用,请将以下设置添加到运行时搜索路径构建设置:

`@loader_path/../Frameworks`

我不确定您是否需要开头和结尾的引号。我只是引用了某人对blog post I wrote on SDL 的评论,他发现 SDL 框架没有被复制到应用程序包中。

关于在最终用户的计算机上安装第三方框架的位置的问题,如果您的应用使用框架并且您希望用户能够在无需安装框架的情况下运行您的应用,请将框架复制到您的应用程序包。如果您需要在用户的 Mac 上安装框架,/Library/Frameworks 是第三方框架的常用位置。

【讨论】:

以上是关于在我的 XCode 4.5 项目中对以红色显示的框架进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

重命名项目Xcode后显示红色的新项目名称和未显示的文件

解析工具包在 xcode 4.5 上崩溃

当我在 xcode 5 中打开我的 xcode 4.5 项目时收到警告

在Xcode 4.5中使用ZXing库时,体系结构armv7的未定义符号

我的 Xcode 项目是如何从 iOS 项目变为 OSX 项目的?

迁移到 Xcode 4.5 后与可达性相关的未定义符号