File not found 的第三种可能

2,323 阅读2分钟

事情是这样的

原来我们的工程的 Podfile 没有指定打包方式,也就是按照默认的方式。我们引用到的一个库 A.framework 默认打出来的包是动态 framework。

A.framework 中有 A.header 文件,其中引用了所有需要暴露的文件头文件,并且引用方式是:

#import <A/X.h>

现在我们需要改成 静态framework 的方式:

use_frameworks! :linkage => :static

然后一直报错:在编译 Target-Swift.h 时 在 A.h 中的 X.h 找不到。

因为是 framework,我认为一般不会出现头文件找不到的问题,可能是 swift 引用导致的问题,我把 swift 对该库的引用都去掉,但还是报错,只不过是在编译其他文件时。

那么头文件找不到一般是两种可能:

  • 头文件确实没有 -> 我打开 A.framework,头文件都放在正确的位置
  • 头文件的搜索路径配置的不正确 -> 因为是 framework,只要 framework 搜索路径配置的正确就木有问题了,经检查没有问题

这个问题我搞了一天。。。

最终放弃,直接把库拖到工程里去,没想到还报错,说文件重复,并且附上了都哪里有这个文件,哎呦我去,我一看,A.h 咋能有重复呢。

找到对应路径,最终破案了:工程目录下还有个 A.framework 在,但是没有引入到工程中,虽然没有引入到工程中,但它还是影响编译了。

这种问题已经是我最近第二次碰到了,很愤慨这样的事情。

上一次情况描述

上一次的问题是我的锅,也是找了一天。。。。

我需要做一个私有库 Base,让主工程引用,为此我创建了以下 project 和 workspace:

  1. Base.project
  2. Demo.project:通过 cocoapods 引用 Base,是为了验证 Base 中的代码是否有问题,相当于主工程了
  3. Demo.workspace:Demo 通过 cocoapods 引用 Base 后,就有了这个 workspace

其中 Base.project 依赖很多的第三方库,比如 MJExtension。

如果我想在 Base 中增加文件,我需要这样做:

  1. 打开 Base.project,添加文件
  2. 在 Demo.workspace 下 pod install
  3. 打开 Demo.workspace 验证是否正确

我嫌麻烦,就想着把 Base.project 也引进 Demo.workspace 中,我天真地以为这个新添加进来的 Base.project 没有被 Demo.project 引用到。

然鹅,一直报错说:MJExtension 找不到,但是 Pods 里明明有。

最后发现是这个看似无害的、没有关联的 Base.project