如何将 Objective C 静态库导入 Swift 框架?
Posted
技术标签:
【中文标题】如何将 Objective C 静态库导入 Swift 框架?【英文标题】:How to import Objective C static library to Swift Framework? 【发布时间】:2015-10-23 10:48:18 【问题描述】:我正在用 Swift 为 OS X 编写一个动态框架 (Proto.framework
)。我想包含一个用 Objective C 编写的静态库 (libstat.a
) 中的代码。这就是我所拥有的:
// Dynamic.swift in Proto.framework
class Dynamic
func doSomethingWithStat()
Stat().statThing()
// Stat.h in libstat.a static library
@interface Stat : NSObject
- (void)statThing;
@end
// Stat.m
@implementation Stat
- (void)statThing
NSLog(@"OK");
@end
在我的 Proto.framework 目标中,我已将其链接到 libstat.a。当我尝试构建 Proto 时,它自然无法编译,因为它找不到 Stat().statThing()
的定义。它不知道我的静态库的符号。我该怎么说呢?
对于应用程序,我会使用桥接头并使用#import <Stat/Stat.h>
。但是编译器出错并告诉我Bridging headers aren’t allowed in frameworks
。好的。
所以我将它包含在我的“伞形标题”(Proto.h
)中,但这告诉我error: include of non-modular header inside framework module
。好的。
使我的 Stat
库目标 Defines module: YES
即使在干净构建之后似乎也不会改变错误。所以我不知道该怎么做。
有人能指出正确的方向吗?
【问题讨论】:
您最终解决了这个问题吗?我正在努力解决同样的问题。 这里有同样的问题。有什么解决办法吗? 我也有同样的问题。还在寻找... 【参考方案1】:我通过将标题设为公开(而不是项目)解决了这个错误
转到您的目标构建阶段并相应地移动标题:
这适用于我的“lib”目标。但我仍然无法构建 libTests 目标。在这里我得到 2 个错误:
'header.h' 文件未找到包含;改用“引号” 再一次:在框架模块“lib”中包含非模块化标头这个我还不能解决
【讨论】:
【参考方案2】:最简单的方法是使用模块映射文件。下面我假设你在一个名为Proto
的单独项目中拥有Proto.framework
。
-
在您的框架中创建一个
module.modulemap
文件,其中包含以下内容(根据需要替换头文件的路径):
_
framework module Proto
umbrella header "Proto.h"
// Load a C header to be used in Swift - here /usr/include/sys/stat.h:
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sys/stat.h"
export *
module * export *
-
在您的项目构建设置中,在
Packaging
部分找到Module Map File
。输入$(SRCROOT)/Proto/module.modulemap
就是这样。从现在开始,您应该可以在 Swift 中使用 stat.h
中声明的任何内容。
【讨论】:
很遗憾在 Xcode 7.2 中也没有看到模块映射设置 @MaxMacLeod 只需在文本编辑器(例如 TextWrangler)中创建一个新文件并将其拖放到您的项目中。不要忘记选择目标。 它是否也适用于归档应用程序?添加 module.map 后,我可以解决“包含非模块化标题”的问题,但是当我归档项目时,它没有找到桥接头文件。抱怨缺少标题。当我检查生成文件夹以在派生数据中发布时,我在那里看不到任何 hedaer 文件。在添加模块映射之前存在。任何想法?我正在开发 xcode 10【参考方案3】:在Proto.framework
的构建设置中,尝试将选项Allow Non-modular Includes In Framework Modules
设置为Yes
。
【讨论】:
刚刚试了一下,仍然得到error: include of non-modular header inside framework module Proto
:\
我有同样的问题(xcode 7,swift 2)。有人找到解决方案吗?
我必须公开我在伞形标题中导入的附加标题以上是关于如何将 Objective C 静态库导入 Swift 框架?的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 将 Objective-C 库项目导入 SwiftUI 项目
Cocoapod使用Mix和Match Swift和Objective-c代码