【问题标题】:iOS - Build fails with CocoaPods cannot find header filesiOS - 构建失败,CocoaPods 找不到头文件
【发布时间】:2012-08-13 17:33:43
【问题描述】:

我有一个使用 CocoaPods 的 iOS 项目。一切都很顺利,直到另一个开发人员开始从事同一个项目。他做了一些更改(据我所知仅对代码进行了更改)并在 repo 中创建了一个新分支。我检查了他的分支并尝试构建它,但我收到一个错误:找不到 ASLogger/ASLogger.h 文件。

即使我删除整个项目并制作一个新副本并使用“pods install”。构建失败仍然存在。你知道问题出在哪里吗?如果您需要更多信息,请询问。

【问题讨论】:

  • 我没有使用双引号样式,#import "ASLogger.h" 我尝试了这个,#import 它对我有用:)
  • 仅供参考:Baigs 的简单答案解决了我找不到标题的问题。

标签: objective-c ios cocoa build cocoapods


【解决方案1】:

我认为最终的解决方案是转到 Build settings -> Search Path -> User Header Search Paths,找到您的库路径并在 Finder 中浏览它。确保所有路径都存在,包括您的导入路径。

对我来说,我的路径比教程中的要短。在教程中它类似于#import <SDK/path/to/sdk/File.h>,但事实证明它只是#import <SDK/File.h>

【讨论】:

    【解决方案2】:

    我发现将库作为 pod 安装直接有助于动态库。例如,对于 Firebase:

    pod 'RNFirebase', :path => 'path/to/node_modules/react-native-firebase/ios'
    

    或者对于 ASLogger:

    pod 'ASLogger', :path => 'path/to/node_modules/aslogger/ios' // path to header files
    

    更改或硬编码HEADER_SEARCH_PATHS 对我没有帮助。如果错误再次出现,不需要rm -rf node_modules 也不需要删除 pod 文件等,我发现清除缓存很有用。

    对于 react-native,我运行

        rm -rf $TMPDIR/react-native-packager-cache-*
        rm -rf $TMPDIR/metro-bundler-cache-*
        rm -rf $TMPDIR/metro-* 
        rm -rf $TMPDIR/react-* 
        rm -rf $TMPDIR/haste-*
        rm -rf "$(getconf DARWIN_USER_CACHE_DIR)/org.llvm.clang/ModuleCache"
        npm start -- --reset-cache
    

    对于 Xcode,我删除了 ~/Library/Developer/Xcode/DerivedData 中的文件夹

    【讨论】:

      【解决方案3】:

      我这里还有其他可行的解决方案,

      1. 退出 Xcode
      2. 打开 Xcode 并清理项目
      3. 首先构建 Pods 项目
      4. 构建项目

      【讨论】:

        【解决方案4】:

        对我来说,解决问题的是我的 Pods 项目的 iOS 部署目标低于我的项目本身。一旦我把它和我的项目一样,它就能找到头文件。

        【讨论】:

        • 兄弟!你应该得到 1000 票。我被困了 4 个小时,你的解决方案帮助了我。非常感谢兄弟,非常感谢!
        【解决方案5】:

        我将在我的构建设置中更新以下内容,我没有收到任何错误。在更新 cocoapods 时检查这些内容。

        构建设置

        启用位码 - 是(如果您使用的是位码)

        宏预处理器 - $(inherited)

        其他链接器标志 - objc、-lc++、$(inherited)

        仅构建架构

        调试 - 是

        发布 - 否

        搜索路径

        框架搜索路径 - $(inherited) $(PROJECT_DIR)

        库搜索路径 - $(inherited)

        标头搜索路径 - $(inherited)

        【讨论】:

          【解决方案6】:

          我发现 ${PODS_HEADERS_SEARCH_PATHS} 丢失了,并且它没有在我的开发 git 分支中定义,所以我为带有递归的标题搜索路径添加了 "$(SRCROOT)/Pods/Headers/"

          这对我来说没问题

          【讨论】:

          • 这就是我的答案,我更新了 cocoapods,我认为这让 PODS_HEADERS_SEARCH_PATHS 消失了。我的解决方案与此类似,但我使用了 "$(PODS_ROOT)/Headers"
          • 其他答案对我不起作用,但这个答案对我有用。我会注意到我没有包含“,所以我的标题搜索路径看起来像这样$(SRCROOT)/Pods/Headers
          • @Hlung 嗨,我必须在哪里添加 $(SRCROOT)/Pods/Headers/ ?欣赏它
          • @VAAA 目标 > 构建设置 > 标头搜索路径
          • 我认为这是应该接受的正确答案,你认为@Filip Majernik
          【解决方案7】:

          还有一个原因:所有的头文件路径看起来都很好,但我们在尝试读取 pod 头文件的预编译 (.pch) 文件中仍然有错误

          (即#import )。

          查看原始构建输出,我终于注意到错误是破坏了我们的 Watch OS 扩展目标,而不是我们正在构建的主要目标,因为我们还将 .pch 预编译的头文件导入到 Watch OS 目标中,并且它在那里失败了。确保您随附的 Watch OS 目标设置不要尝试导入 .pch 文件(尤其是如果您像我一样从主目标设置设置导入!)

          【讨论】:

            【解决方案8】:

            一个简单的解决方法是: 1. 删除 Pods 文件夹和 Podfile.lock 文件。但不要删除 Podfile 2. 在您的项目根文件夹中运行以下命令:

            pod install
            

            【讨论】:

            • 我用这个解决方案解决了我的问题。
            【解决方案9】:

            我通过我想使用的拖放框架解决了 Xcode 8.2.1 的这个问题。

            【讨论】:

              【解决方案10】:

              我也遇到了同样的问题,但是上面的解决方法都行不通。 我已经这样做了:

              1. 删除整个项目
              2. 运行 git clone 项目并运行 bundle exec pod install
              3. cd peoject 并运行 remote add upstream your-remote-rep-add
              4. git 获取上游
              5. git checkout master
              6. git 合并上游/master

              然后它就起作用了。

              【讨论】:

                【解决方案11】:

                尝试为你的目标评论这一行

                #  use_frameworks!
                

                或者你可以参考我的另一个答案added unit testing target to xcode - failed to import bridging header won't go away

                【讨论】:

                  【解决方案12】:

                  如果上述方法都不适合您,并且您发现此错误是因为您刚刚在 Podfile 中切换到 use_frameworks!,请继续阅读:

                  我尝试了上述所有解决方案以及更多,然后才知道在我的特定情况下它根本与搜索标题路径无关;就是当你在 Podfile 中切换到 use_frameworks! 时,你不再需要在桥接头中包含框架,事实上 Xcode 会抛出非常无用的“无法找到标头”错误。

                  您需要做的是从您的桥接头文件中删除所有导入,而是根据需要在您的各个 Swift 文件中使用 Swift import Module,就像您对 Swift 框架所做的那样。

                  如果您在 Obj-C 类中使用任何框架头文件(在我的例子中,我们有一个使用 FBSDK 的便利类),您需要将其从本地导入更改为全局导入(这意味着更改 @987654324 @ 到 #import <Module/Module.h>,当你开始输入框架名称时,它应该会自动完成。在我的例子中是 <AFNetworking/AFHTTPRequestOperationManager.h>)。

                  编辑:从那以后,我了解到执行@import Module 使用更安全的保护伞文件。

                  【讨论】:

                    【解决方案13】:

                    我是团队中唯一遇到同样问题的开发人员,它对每个人都非常有效,所以我意识到它必须是我的环境。我在另一个目录中尝试了同一个项目的git clone,它编译得很好,然后我意识到它必须是 Xcode 为我的项目路径缓存的东西,“某处”是 DerivedData 文件夹,只需将其删除并进行清理构建您的项目,它对我有用。

                    您可以通过以下方式获取路径,甚至可以在 finder 中打开文件夹:

                    Xcode -> 首选项 -> 位置 -> **DerivedData

                    【讨论】:

                    • 在我的情况下,更新 pod 后出现问题,所以我认为在 cocoapods 中应该搜索问题。我在这里尝试了所有解决方案,但没有成功,最后只是清除了 DerivedData - 它有帮助!谢谢
                    【解决方案14】:

                    对我有用的是选择 Pods 项目,在 Pod 项目的目标目录中查找并选择缺少标头的目标框架,并在目标的构建设置中的“架构”下将“仅构建活动架构”设置为“否” .

                    【讨论】:

                      【解决方案15】:

                      1.检查

                      构建设置 -> 搜索路径 -> 用户标头搜索路径 ->

                      • “${PODS_ROOT}/”递归

                      2.检查导入样式(KEY POINT), 如果你的podfile 设置了

                      use_frameworks!

                      在你的File-Bridging-Header.h中,格式化程序应该是这样的

                      #import "MBProgressHUD.h"

                      else应该在下面

                      #import <MBProgressHUD.h>

                      3.那一定是工作!相信我

                      【讨论】:

                      • 大部分错误消失。但是,当依赖项具有如下导入语句时我该怎么办:#import 。然后编译器告诉我改为编写#import EARestrictedScrollView.h。但我无法修改我的 pod。
                      【解决方案16】:

                      wiki 给出了如何解决这个问题的建议:

                      如果 Xcode 找不到依赖的头文件:

                      检查 pod 头文件是否在 Pods/Headers 中正确符号链接 并且您没有覆盖 HEADER_SEARCH_PATHS (请参阅#1)。如果 Xcode 仍然找不到它们,作为最后的手段,您可以在导入之前添加, 例如#import "Pods/SSZipArchive.h"。

                      【讨论】:

                      • 能否详细说明如何“检查 pod 头文件是否在 Pods/Headers 中正确符号链接”?
                      • 请查看我上面的回答,了解如何检查符号链接
                      • 在您修改导入语句之前,请参阅 Brainray 对配置的回答。
                      • 是的,一些 pod 链接到一个无效的目录,例如 $(PROJECT_DIR)/Pods/Headers/Public/xxx/ios/xxx.h,还有一个额外的 ios 文件夹...
                      【解决方案17】:

                      如果您在“pod install”或“pod update”后出现构建错误,则可能是您的其中一个 pod 是使用 XCode 6.3,而您仍在使用以前的版本。

                      在我的情况下,我必须将我的 OSX 从 Mavericks 更新到 Yosemite 才能拥有 Xcode 6.3 并解决问题

                      【讨论】:

                      • 嗨@omaty,这是唯一的解决方案吗?我目前正在使用 Xcode 6.2 在 Mavericks 上运行
                      • 你好@goelv 在我的情况下,这是我找到的唯一解决方案。在 Mavericks 和 Xcode 6.2 下,我和你一样。
                      • 我想我也有同样的问题。我的队友在 Yosemite 有 Xcode 6.3,对他来说效果很好,而我正在努力摆脱 Xcode 6.2 中 Mavericks 中找不到标头的问题。
                      • 跟进:我也将机器升级到 Yosemite 和 Xcode 6.3.1,我现在可以毫无问题地构建了。
                      【解决方案18】:

                      没有一个答案对我有帮助(我将我的 pod 与所有目标链接,正确构建配置设置,正确设置搜索路径“$(inherited)”等...)。

                      在我使用标准安装/更新命令将 cocoapods 更新到最新的调试版本后,问题自行消失了:

                         gem install cocoapods --pre
                      

                      或:

                         sudo gem install cocoapods --pre
                      

                      (如果在安装过程中使用了 sudo)。

                      一定是cocoapods的虫子。

                      【讨论】:

                        【解决方案19】:

                        我必须从 git hub 下载 zip 并将丢失的文件拖到 Pod/ 中相应路径的 Finder 中...

                        【讨论】:

                          【解决方案20】:

                          这对我有用:

                          转到目标>“构建设置”选项卡并找到“用户标题搜索路径”设置。

                          将此设置为“$(BUILT_PRODUCTS_DIR)”并选中“递归”复选框。

                          现在构建的目标将搜索工作区的共享构建目录以找到可链接的头文件。

                          ====

                          更新

                          我最近遇到了类似(尽管略有不同)的问题。结果 Xcode 找不到 Pod,因为我打开了 .xcodeproj 文件而不是 .xcworkspace 文件。将来可能会帮助其他人。

                          【讨论】:

                          • 这对我有用,但只有在退出 Xcode、运行 pod install 并重新打开之后。
                          • @Snowcrash 目标是什么? pod 目标还是主项目目标?
                          【解决方案21】:

                          对我来说,问题在于其他链接器标志值。出于某种原因,我在 -l"xml2" -l"Pods-MBProgressHUD" 这样的标志中没有引号。

                          【讨论】:

                          • 我在使用 Localytics 的 Cocoapod 时遇到问题。在Other Linker Flags 下我找到了两个条目:-|Localytics|-PodsLocalytics。我删除了这些,然后就可以编译了。
                          【解决方案22】:

                          更新

                          确保您的Podfile 在缺少配置文件的目标上包含link_with。否则只有 Cocoapods sets the first target by default。例如

                          platform :osx, '10.7'
                          pod 'JSONKit',       '~> 1.4'
                          
                          link_with 'Pomo', 'Pomo Dev', 'Pomo Tests'
                          

                          ----- 结束更新


                          注意:请注意,您必须查看 Project->Info->Configurations 以了解以下步骤。


                          我有类似的症状,发现pods.xcconfig 文件没有包含在我尝试构建的特定target 中。其他一些建议的解决方案对我有用,但这个似乎解决了部分根本问题。

                          简单的解决方案是为没有设置的目标更改设置配置文件。

                          【讨论】:

                          • 对我来说,“pods install”只在第一个目标上设置。按照这个答案中的建议做解决了我的问题。
                          • 最后一个解决方案:Pods 仅添加到第一个目标,而不是各种测试发布目标(alpha、beta、候选发布)!非常感谢!
                          • 使用link_with 指定我的其他目标对我有用。非常感谢。我只是在这上面花了几个小时。
                          • link_with 在 Cocoapods 1.0 或更高版本中不受支持。
                          • @Vive 是正确的,“link_with”不受支持。我们应该改用“目标”。所以在这个示例中,它应该像这样更改 >>> 目标'Pomo','Pomo Dev','Pomo Tests'
                          【解决方案23】:

                          这就是我的答案,我更新了 cocoapods,我认为这让 PODS_HEADERS_SEARCH_PATHS 消失了。我的解决方案与此类似,但我使用了“$(PODS_ROOT)/Headers” – Andrew Aitken

                          非常感谢您的回答。我很难找到解决问题的方法。非常感谢。

                          【讨论】:

                            【解决方案24】:

                            我在 Xcode 5.0 的 GM 种子上,但我无法得到任何这些答案。我在关于使用 cocoapods 的标头导入的多个不同问题上尝试了关于 SO 的每一个答案。

                            我终于找到了适合我的解决方案:我通过 Mac AppStore 升级到 Xcode 5.0(安装在 GM 种子之上),现在标题导入按预期工作。

                            我的系统上还有一个 Xcode 5 的测试版,我也删除了它。也许这是两者的结合,但希望这对其他人有所帮助。

                            【讨论】:

                              【解决方案25】:

                              您是否尝试过导入 Cocoapods 样式?

                              #import <ASLogger.h>
                              

                              网站上的信息不是很清楚,我提交了一个拉取请求:

                              https://github.com/CocoaPods/cocoapods.org/pull/34

                              更新:他们撤回了我的请求 :)

                              【讨论】:

                              • 我没有使用双引号样式,#import "ASLogger.h" 我尝试了这个,#import 它对我有用:)
                              • 我以前试过这个,它对我有用,但有时当它不起作用时会出现不同的问题。至少在某些情况下,您还可以使用 格式。
                              • 是的,这对我也有用!没有多少清理和删除派生数据可以解决这个问题,但这很有效。
                              【解决方案26】:

                              其他两个答案在这里都没有帮助。我发现了另外 2 个可能会解决它的问题:

                              编辑 您可以通过这种方式检查符号链接:创建一个名为“check”的文本文件,不带扩展名。将这些行复制到其中:

                              file=/Users/youUserName/XcodeProjectName/Pods/BuildHeaders/SVProgressHUD/SVProgressHUD.h
                              if [[ ! -e $file &&  -L $file ]]; then
                                echo "$file symlink is  broken!"
                              else
                                echo "symlink works"
                              fi
                              

                              然后转到终端,切换到您的检查文件所在的文件夹并键入

                              bash check
                              

                              【讨论】:

                              • 非常感谢!第一个条目为我解决了它。仅在我们的项目中为第一个目标设置了 Pods。这编译得很好,但另一个目标没有。所以我也添加了 Pods 配置,现在问题消失了。
                              • 我在配置中没有看到 'Pods' .. 这是否意味着我的符号链接已损坏?
                              【解决方案27】:

                              头文件,你会是我的死...

                              最后通过添加(包括引号)让它工作

                              "${PODS_ROOT}/BuildHeaders"
                              

                              到用户标题搜索路径条目,并检查“递归”。

                              【讨论】:

                              • 请注意,引号在这里非常重要。没有他们,我无法让它发挥作用。
                              • +1 我已经有了$(inherited)(没有用),但添加它对我有用。
                              • 没有得到你想说的。 :/ 你能详细说明一下吗?
                              • 另一个方便的技巧是清除工作空间和 pods 目录并重新安装 pod。这通常是一个更完整的解决方案。
                              • 这终于帮助 AppCode 正确找到所有头文件导入。没有这个,它在 xCode 中有效,但在 AppCode 中无效。谢谢!
                              【解决方案28】:

                              更新

                              自从我的原始答案以来,我已经更新了这个,得到了反对,所以我希望这会有所帮助。如果是这样,希望它会收回我的投票。

                              如果标题没有被导入,您可能在HEADER_SEARCH_PATHS 中有冲突。尝试将$(inherited) 添加到构建设置中的标题搜索路径,以确保它从 CocoaPods 中提取 .xcconfig 文件中包含的任何搜索路径。

                              这应该有助于解决任何冲突并正确导入您的源代码。

                              【讨论】:

                              • 我遇到过问题:在应用程序中未检测到 Pod 文件,并且当您删除或移动 .svn 子目录时会出现“svn 受阻文件夹问题”: 解决方案:通过以下步骤: 1.卸载来自应用程序的 CocoaPods 如此而已。 xcodeproj 文件存在(参考:stackoverflow.com/questions/16427421/…) 2.Installed podfiles 再次(参考:raywenderlich.com/12139/introduction-to-cocoapods) 3. $(inherited) 标志添加到应用程序的目标“HEADER_SEARCH_PATHS”和“OTHER_LDFLAGS”中。
                              • 您可能还需要将 $(inherited) 添加到您的 FRAMEWORK_SEARCH_PATHS 设置中。
                              • @AlphonseR.Dsouza 您的解决方案对我有用 - 将 $(inherited) 添加到 OTHER_LDFLAGS,谢谢一百万!
                              • $(inherited) 应该添加到项目设置还是目标设置中?
                              • 我有类似的问题,我过去没有使用 pod 的经验。在 Podfile 中,我也没有提到 2 个目标。是的,我有 2 个目标。一旦我提到第二个目标并更新了 Pod 文件,终端就会发出一些警告,类似于您添加 $inherrited 的建议。我做到了,而且效果很好。
                              猜你喜欢
                              • 2013-09-16
                              • 1970-01-01
                              • 2016-09-19
                              • 1970-01-01
                              • 2023-04-09
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2014-06-01
                              相关资源
                              最近更新 更多