Macos 如何将Objective C静态库导入Swift框架?
我正在用Swift为OSX编写一个动态框架(Macos 如何将Objective C静态库导入Swift框架?,macos,swift,frameworks,static-libraries,Macos,Swift,Frameworks,Static Libraries,我正在用Swift为OSX编写一个动态框架(Proto.Framework)。我想包含一个静态库(libstat.a)中的代码,该库是用Objective C编写的。下面是我得到的: // Dynamic.swift in Proto.framework class Dynamic { func doSomethingWithStat() { Stat().statThing() } } // Stat.h in libstat.a static library
Proto.Framework
)。我想包含一个静态库(libstat.a
)中的代码,该库是用Objective C编写的。下面是我得到的:
// 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()的定义。它不知道我的静态库的符号。我该怎么说呢
对于应用程序,我会使用桥接头并执行导入。但是编译器出错并告诉我框架中不允许使用桥接头。嗯
因此,我将其包含在我的“伞形头”(Proto.h
)中,但这告诉我错误:在框架模块中包含非模块头。嗯
使我的Stat
library目标Defines模块:YES
即使在干净的构建之后似乎也不会改变错误。所以我不知道该怎么做
有人能给我指出正确的方向吗?在Proto.framework
的构建设置中,尝试将允许框架模块中的非模块包含选项设置为是
实现这一点的最简单方法是使用模块映射文件。下面我假设您在一个单独的项目中拥有Proto.framework
,该项目名为Proto
在框架中创建一个module.modulemap
文件,其中包含以下内容(根据需要替换头文件的路径):
_
在项目生成设置中,在打包
部分中查找模块映射文件
。输入$(SRCROOT)/Proto/module.modulemap
就这样。从现在起,您应该能够在Swift中使用stat.h
中声明的任何内容。我通过公开标题(而不是项目)解决了此错误
转到目标构建阶段并相应地移动标题:
这适用于我的“lib”目标。但我仍然无法构建libTests目标。这里有两个错误:
- 未找到包含的“header.h”文件;用“引号”代替
- 同样:在框架模块“lib”中包含非模块头
我还不能解决这个问题只是尝试了一下,仍然得到了错误:在框架模块Proto中包含非模块头文件
:\n我也有同样的问题(xcode 7,swift 2)。有人找到解决方案吗?我必须公开我在伞头中导入的附加标题。你最终找到了吗?我在为同样的问题挣扎,同样的问题。有办法吗?我也有同样的问题。还在看…在Xcode 7.2中也没有看到模块映射设置unfortunately@MaxMacLeod只需在文本编辑器(例如TextWrangler)中创建一个新文件,然后将其拖放到项目中。别忘了选择目标。它对存档应用程序也有效吗?添加module.map后,我可以解决“包含非模块头”的问题,但当我存档项目时,它找不到桥接头文件。投诉缺少标题。当我在派生数据中检查build文件夹以进行发布时,我在那里看不到任何hedaer文件。在添加模块映射之前存在。有什么想法吗?我正在处理xcode 10
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 * }
}