第二次构建后不再找到 Xcode 框架
Posted
技术标签:
【中文标题】第二次构建后不再找到 Xcode 框架【英文标题】:Xcode framework no longer found after second build 【发布时间】:2019-11-02 17:39:39 【问题描述】:自从我升级到 Xcode 11 后,我开始的每个包含框架的新项目都不能在项目的第二次构建之后再编译。
例如使用此命令包含 SDL2:
#include <SDL2/SDL.h>
会导致这个错误:
'SDL2/SDL.h' file not found
在第二次编译项目之后。
在 Xcode 10 中创建的项目在 Xcode 11 中可以正常工作。
我尝试更改框架的嵌入选项,但没有设置有效。此错误发生在所有 Xcode 11 版本 (0 - 2.1) 中。
我正在使用 macOS 版本10.14.6
。
为什么会发生这种情况或如何解决?
【问题讨论】:
【参考方案1】:我对 XCode 11.1 也有同样的问题。我发现我需要在 Build Settings/Search Paths 中添加 Header Search Path 到:
/Library/Frameworks/SDL2.framework/Versions/A/Headers
然后它起作用了。路径好像变了。
【讨论】:
遗憾的是这对我不起作用,这也不能解释为什么错误只发生在第一次构建之后。【参考方案2】:我终于找到了解决办法。我将此屏幕截图中带有菜单的框架添加到我的项目中:
在 Xcode 9 和 10 中,这与使用此菜单添加框架相同:
但现在在 Xcode 11 中,这已经不一样了。使用第一个菜单添加框架会将框架从其原始路径复制到项目的构建文件夹中,但由于某种原因,Xcode 不复制框架中的Headers
文件夹。我认为这是一个错误,但似乎他们至少没有将其修复到 Xcode 版本11.2.1
。
所以现在解决这个问题的方法是使用第二张图片中的Build Phases
菜单添加框架。
【讨论】:
【参考方案3】:SDL2 不是一个框架。相反,它是静态库或动态库。当然,除非您正在使用其他一些定制的 SDL2 框架。
您通常会遇到两种情况:
-
SDL2 安装在默认位置,例如 /usr/local
SDL2 安装在自定义位置(我就是这样做的)
我猜你正在做前者。如果是这种情况,Xcode 11 的默认系统头文件搜索路径可能以某种方式更改为不包括 /usr/local (或您安装它的位置)。
要解决此问题,您应该首先找到您的 SDL2 库。特别是包含文件的位置。
然后在 Build Settings 中,转到 Search Paths:System Header Search Paths 并输入该路径。
请记住#include
使用SDL2
作为路径的一部分,因此您不想将SDL2
部分放在路径中。这是我的目录结构的示例。所以我的路径条目是$(PROJECT_DIR)/3rdParty/SDL2/include
。您可以在我的项目目录中看到,我有一个 3rdParty 目录,用于保存我集成到项目中的第 3 方库。
您正在使用尖括号进行包含,它利用了系统路径。
请注意,您可能还需要更新链接到 SDL2 的方式(即它可能无法找到它)。
【讨论】:
我不知道你是如何安装 SDL 的,但自 2.0.8 版以来的默认方式是一个真正的.framework
文件,放入 /Library/Frameworks/
。我也是这样做的。我所有的静态库仍然可以正常工作,只是框架不起作用。另外奇怪的是,它只发生在第一次构建之后,而不是在第一次构建中。
嗯,很有趣。我正在使用 2.0.10。我从源代码构建它。我通常会在可能的情况下构建第 3 方,在 SDL2 的情况下,这很容易做到。我不认为在这种情况下使用框架有净优势。您可以尝试将系统框架搜索路径调整到框架所在的位置。显然,您会将其显式设置为 /Library/Frameworks,但至少您可以从您查看的内容列表中检查它。
我真的很喜欢框架,而且我总是使用它们。有了它们,Mac 上的库已经得到处理。路径已经设置,所以这不是问题。以上是关于第二次构建后不再找到 Xcode 框架的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 12:在 FIRAnalyticsConnector 上构建错误