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中的语句。
更多信息:
ViewController.h 是两个框架中的公共头文件,并且包含在两个目标的伞头头文件中:
#import <MyFramework/ViewController.h>
Run Code Online (Sandbox Code Playgroud)标头的每个版本都将目标成员资格设置为适当的目标。
对于这两个目标,Header Search Paths和User Header Search Paths为空,Always Search User Paths为 NO。
我试图将标题搜索路径设置为以下每个值,但无济于事:
$(SRC_ROOT)/Platforms/macOS/$(SRC_ROOT)/Platforms/macOS/**./Platforms/macOS/./Platforms/macOS/**我尝试暂时删除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 编写的应用程序中使用我的框架时,整个“不定义模块”业务会引起麻烦......?
| 归档时间: |
|
| 查看次数: |
1915 次 |
| 最近记录: |