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

时间:2016-09-14 01:59:42

标签: ios xcode macos frameworks header-files

类似的问题已经被问及并回答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语句。

更多信息:

  1. ViewController.h是两个框架中的公共标题,并包含在两个目标的标题中:

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

  3. 对于这两个目标,标题搜索路径用户标题搜索路径为空白,始终搜索用户路径为空。

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

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

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

    编辑:我在第(4)步尝试了与“框架搜索路径”相同的路径值。同样的错误。

    更新:

    如果我将构建设置始终搜索用户路径设置为 YES (默认为NO),我的框架将构建。我甚至可以构建一个链接到它的示例Mac应用程序并运行它。但是,我收到了警告:

      

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

    ...但我在某个地方看到这会导致麻烦(现在找不到帖子)。

    更新2:

    此外,如果我将构建设置定义模块更改为(如警告所示),嵌入它的框架和应用程序都会成功构建,框架的类可以从应用程序代码中获得(即可实例化)。

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

0 个答案:

没有答案