首页 > 解决方案 > 未找到 Objective-C 头文件 (AFNetworking.h)

问题描述

#import <AFNetworking/AFNetworking.h>

我将 AFNetworking.h 文件导入到 .m 文件,但出现如下错误:

找不到“AFNetworking/AFNetworking.h”文件

我删除了 pods 文件夹和 Podfile.lock,并重新安装了 Podfile 但没有解决。我应该怎么办?(我打开了工作区文件。)

标签: objective-cafnetworkingpodfile

解决方案


链接!==复制。

有C风格#include ...和Objective-C风格#import ...

两者的工作方式几乎相同..
其中#import读取标题但如果完成一次则不再包含。因为这有时会失败并且确实会失败(通常是因为在不同的方言中混合了 C、C++、Objc、Objc++),我们经常使用#define规则来确保所包含的代码被确定读取一次而不是再次读取,这反过来也适用于包含代码时并用#include声明。它将被包含但不会编译两次。

#ifndef SOME_HumanReadableFlag_h
#define SOME_HumanReadableFlag_h

// ... your header code here..
@interface XyzObject : FromInheritedClass

@end

#endif

现在为什么重要?
从其他类的角度来看,包含头文件内容的#define 规则可能会隐藏头文件。当类没有正确编写并考虑到最终开发人员的结构时,这种情况经常发生。它可能适用于开发人员的工作台,但不适用于其他实施它的人。

你的错误清楚地告诉“ File not found ..
所以首先看看导入/包含规则的一般区别

  1. #import <LibFrameworkName/LibFrameworkName.h>
    意味着您必须链接框架或库,即使您在该项目中自己开发了一个。该规则与您的项目相关,LibFrameworkName 是一个框架/库。
    如果在某处找到#include <LibFrameworkName/LibFrameworkName.h>是不正确的,除非您想以 c 样式将此框架标头包含到您的二进制文件标头中,2) 告诉您一些原因..
  2. #import "LibFrameworkName/LibFrameworkName.h"
    意味着您必须将此标头复制/提供到您的项目中,并使用名称为 LibFrameworkName 的子文件夹。一旦在某个地方正确声明,Xcode 可能会找到并应用标头,即使稍后在该特定类中使用错误的规则声明,您也应该在 IDE 中收到警告。在 AFNetworking 的情况下,您不想将系统 SDK 框架复制到您的项目中,也不要复制到第三方框架中,除非您知道自己在做什么。此规则与项目结构中的文件位置相关,这意味着它会尝试在带有此规则的文件下方查找名称为LibFrameworkName的某个文件夹。

它说什么:因为框架没有链接,编译器会尝试使用给定的名称来查找它,而忽略<&>就好像它在哪里一样 2) 具有该文件夹名称的文件,然后将找不到它并引发错误或警告。

为了强制预编译器解析某些特定文件夹,我们有时会使用标题搜索路径来明确告诉在哪里找到它。被广泛使用并且最麻烦,因为它还向开发人员隐藏了错误定义的规则,因为 Xcode 会跳过代码中仍然存在的错误导入规则,假设它已经知道这个头文件。或者它会在一切正常时发出警告。其他开发人员会遇到麻烦,文件结构和标题列表根本不匹配。所以请记住,当您可以避免使用标头搜索路径列表时,请使用它。它也将并且不应该解决您的问题。

'<AFNetworking/AFNetworking.h>' File not found表示您的项目不知道框架模块。此标头是框架的一部分。

解决方案:您必须转到Projects Settings并向下滚动到Frameworks and Libraries,点击此列表下方的 [+]。它应该打开对话框,显示您选择的项目目标中的所有 SDK 以及您自己项目的所有已知 Pod 或已知框架,当您开发一些时。按名称搜索框架或库,单击它,点击“添加”.. 完成..

从那里开始 - 有一些选项可以习惯它。
因为链接并不意味着默认情况下在编译时复制到您的资源中。通常 Xcode 知道它不必将系统 SDK 复制到项目框架文件夹中,所有 macUsers 都在他们的系统上预先安装了正确版本的框架。${SOMEFLAGWHEREEVERTHISPOINTSTO}/AFNetworking/AFNetworking.framework/Headers除非有人想推翻系统,否则链接到某些特定文件夹实际上是错误的框架头文件,也可能是二进制文件。

因此AFNetworking不应出现在Build Phases > Copy Bundle Ressources列表下,但在完成上述过程后,它将出现在Link Binary with Libraries下,当 Xcode 需要了解某些库/框架时,它也可能被放置在Dependencies中,它必须有这个编译。最后提到的选项是因为当某些框架丢失或不可用时,您可以拥有一个在运行时适应的框架。所以这个条目帮助 Xcode 弄清楚它必须以哪种排序方式编译你的东西。

${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers我猜在Header Search Paths中发现一定有问题..因为框架很可能没有复制到 Pods 文件夹中。它应该与 Xcode 附带的 SDKs 文件夹相关。上面提到的链接过程应该可以解决这个问题,然后您可以从标题搜索路径中删除该条目。


推荐阅读