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

时间:2013-01-22 16:18:09

标签: xcode frameworks xcode4.5

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

有两个最常见的位置,它可以显示为红色,一个位于项目导航器窗格(左侧),另一个位于构建阶段区域。在“复制文件”区域中,第三个位置通常显示为红色。这三个都有不同的原因。

这是所有三个地方以红色显示的样子:

enter image description here

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

如果根本找不到框架,那么,当我构建时,框架的头文件无法导入,因此我得到了"词法或预处理器问题"。通常的解决方案是修复Framework搜索路径。然而,即使这看起来是正确的,我仍然经常得到红框架。

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

以下是XCode无法导入框架内的头文件时的示例:

enter image description here

这个问题应该是一般,对将来看到&#34; red&#34;框架列表中的框架。是的,我已经去供应商询问供应商对他们的框架的帮助,这应该是第一步。但是,我觉得&#34; XCode以红色显示框架&#34;令人困惑的是它值得一般有用的答案,因此这个问题。此外,我有理由相信,在这种情况下,供应商的安装程序工作正常,这是我的机器上的本地问题,其他人可能在将来可能有帮助理解和修复。< / p>

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

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

我无法在#34; Xcode如何找到框架&#34;上找到Apple文档。有一个问题here只是询问,但答案都涉及GCC标题搜索路径,而不是Xcode如何找到框架并构建搜索路径。

XCode 4.5搜索哪些文件夹来查找库?即使XCode 4.5本身不再在/Developer中,/Developer文件夹是否仍会被搜索?

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

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

2 个答案:

答案 0 :(得分:2)

是的,这是个好问题。我一直想在相关问题上发帖子:为静态库项目创建一个包,其中包含一个已编译的momd文件,我只能通过使用bundle将库项目嵌套在项目中来实现工作。也就是说,嵌套在Xcode中,在文件系统级别它仍然作为对等体出现。这与项目如何找到其他项目的产品有关。

与此同时,就您的具体问题而言,我已经在我已经完成的每个项目上使用了OCHamcrest,并且除非我实际在项目中安装框架文件,否则我无法可靠地工作。理想情况下,我想在/ Library / Developer / Frameworks等其中一个位置安装OCHamcrest,但是尝试完成这项工作真是太痛苦了,这是疯了。

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

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

答案 1 :(得分:1)

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

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

`@loader_path/../Frameworks`

我不确定你是否需要在开头和结尾都有引号。我刚刚从发现SDL框架未被复制到应用程序包的人那里引用了对blog post I wrote on SDL的评论。

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