Xcode 选择了错误版本的同名头文件

Nic*_*ari 5 macos xcode frameworks header-files ios

已在此处提出并回答类似的问题,但是提供的解决方案并不能解决我的问题。

我的项目有两个目标:Cocoa Framework (macOS) 和 Cocoa Touch Framework (iOS)。

框架共享许多源文件和头文件,但有特定于每个框架的文件(由于平台差异)。

特别是,两个框架都有一个名为ViewController.

在 iOS 上,它是这样声明的:

( $(SRC_ROOT)/Platforms/ iOS /ViewController/ViewController.h:)

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController 
... 
Run Code Online (Sandbox Code Playgroud)

在 Mac 上,像这样:

( $(SRC_ROOT)/Platforms/ macOS /ViewController/ViewController.h:)

#import <Cocoa/Cocoa.h>

@interface ViewController : NSViewController 
...
Run Code Online (Sandbox Code Playgroud)

我还有第三个类Manager,这两个平台都通用。

它只是 的一个子类,NSObject因此它的头文件只需要导入与平台无关的<Foundation/Foundation.h>.

但是这个类的方法与前面提到的交互ViewController,所以实现文件导入了这个头文件:

( $(SRC_ROOT)/Common/Manager.m :)

#import "Manager.h"
#import "ViewController.h" // <-- THIS

@implementation Manager
...
Run Code Online (Sandbox Code Playgroud)

现在,当我构建 iOS 目标时一切正常。

但是当我尝试构建 macOS 目标时,iOS 版本的 ViewController.h 以某种方式被导入,我收到以下错误:

词法或预处理器问题 - 找不到“UIKit/UIKit.h”文件

...指着#importManager.m中的语句。

更多信息:

  1. ViewController.h 是两个框架中的公共头文件,并且包含在两个目标的伞头头文件中:

    #import <MyFramework/ViewController.h>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 标头的每个版本都将目标成员资格设置为适当的目标。

  3. 对于这两个目标,Header Search PathsUser Header Search Paths为空,Always Search User Paths为 NO。

  4. 我试图将标题搜索路径设置为以下每个值,但无济于事:

    • $(SRC_ROOT)/Platforms/macOS/
    • $(SRC_ROOT)/Platforms/macOS/**
    • ./Platforms/macOS/
    • ./Platforms/macOS/**
  5. 我尝试暂时删除iOS版本的header,构建成功。但是在恢复文件并清理构建文件夹后,它再次失败。

如何让 Xcode 在 Mac 目标上“看到”正确版本的标头?


编辑:我从点 (4) 为“框架搜索路径”尝试了相同的路径值。同样的错误。


更新:

如果我将构建设置Always Search User Paths设置为YES(默认为 NO),我的框架就会构建。我什至可以构建一个链接到它并运行的示例 Mac 应用程序。但是,我收到警告:

警告:在构建定义模块的目标 ('DEFINES_MODULE = YES') 时使用 'ALWAYS_SEARCH_USER_PATHS = YES' 可能会失败。请迁移到使用“ALWAYS_SEARCH_USER_PATHS = NO”。

...但我在某处读到这会导致麻烦(现在找不到帖子)。


更新 2:

此外,如果我将构建设置Defines Module更改为NO(如警告所建议的那样),则框架和嵌入它的应用程序都成功构建,并且框架的类可从应用程序的代码中获得(即,可实例化)。

但是,我担心当我尝试从用 Swift 编写的应用程序中使用我的框架时,整个“不定义模块”业务会引起麻烦......?