类似的问题已经被问及并回答here,但是所提供的解决方案并没有解决我的问题。
My Project有两个目标:Cocoa Framework(macOS)和Cocoa Touch Framework(iOS)。
Frameworks共享许多源文件和标题,但是每个框架都有特定的文件(由于平台差异)。
特别是,两个框架都有一个名为ViewController
的类。
在iOS上,它声明如下:
($(SRC_ROOT)
/平台/的的iOS /ViewController/ViewController.h:)
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
...
在Mac上,像这样:
($(SRC_ROOT)
/平台/的 MACOS /ViewController/ViewController.h:)
#import <Cocoa/Cocoa.h>
@interface ViewController : NSViewController
...
我还有第三类,Manager
,这对两个平台都很常见。
它只是NSObject
的子类,因此其头文件只需要导入与平台无关的<Foundation/Foundation.h>
。
但是这个类的方法与前面提到的ViewController
进行交互,因此实现文件会导入该标题:
($(SRC_ROOT)
/普通/ Manager.m:)
#import "Manager.h"
#import "ViewController.h" // <-- THIS
@implementation Manager
...
现在,当我构建iOS目标时,一切都很好。
但是当我尝试构建macOS目标时,会以某种方式导入iOS版ViewController.h并出现以下错误:
词汇表或预处理程序问题 - 找不到'UIKit / UIKit.h'文件
...指向Manager.m中的#import
语句。
更多信息:
ViewController.h是两个框架中的公共标题,并包含在两个目标的标题中:
#import <MyFramework/ViewController.h>
每个版本的标头都将目标成员资格设置为适当的目标。
对于这两个目标,标题搜索路径和用户标题搜索路径为空白,始终搜索用户路径为空。
我尝试将标题搜索路径设置为以下每个值,但无济于事:
$(SRC_ROOT)/Platforms/macOS/
$(SRC_ROOT)/Platforms/macOS/**
./Platforms/macOS/
./Platforms/macOS/**
我暂时尝试删除标题的iOS版本,并且构建成功。但在恢复文件并清理构建文件夹后,它再次失败。
如何让Xcode在Mac目标上“看到”正确版本的标题?
编辑:我在第(4)步尝试了与“框架搜索路径”相同的路径值。同样的错误。
更新:
如果我将构建设置始终搜索用户路径设置为 YES (默认为NO),我的框架将构建。我甚至可以构建一个链接到它的示例Mac应用程序并运行它。但是,我收到了警告:
警告:在构建目标时使用'ALWAYS_SEARCH_USER_PATHS = YES' 定义模块('DEFINES_MODULE = YES')可能会失败。请迁移 使用'ALWAYS_SEARCH_USER_PATHS = NO'。
...但我在某个地方看到这会导致麻烦(现在找不到帖子)。
更新2:
此外,如果我将构建设置定义模块更改为否(如警告所示),嵌入它的框架和应用程序都会成功构建,框架的类可以从应用程序代码中获得(即可实例化)。
但是,我担心当我尝试使用Swift编写的应用程序中的框架时,整个“不定义模块”的业务会引起麻烦......?