如何将Objective-C静态库导入Swift框架?

19

我正在使用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>。但是编译器出现错误,并告诉我桥接头文件不允许在框架中。好吧。
所以我把它包含在我的“伞头文件”(Proto.h)中,但是它告诉我错误:包含模块内非模块化头文件。好吧。
使我的Stat库目标Defines module: YES似乎没有改变错误,即使进行了干净的构建。所以我不确定该怎么做。
有人可以指点我方向吗?

1
你最终解决了这个问题吗?我也在苦苦挣扎。 - Niels
这里也有同样的问题。有解决方案吗? - Geoff H
我有同样的问题。还在寻找解决方法... - yuf
3个回答

10

实现这个最简单的方法是使用一个模块映射文件。下面我假设你有一个名为 Proto 的单独项目中的 Proto.framework

  1. 在你的框架中创建一个包含以下内容的 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 * }
}
  1. 在您的项目构建设置中,在Packaging部分中找到Module Map File。 输入$(SRCROOT)/Proto/module.modulemap

就这样。 从现在开始,您应该能够在Swift中使用在stat.h中声明的任何内容。


很遗憾,在Xcode 7.2中也没有看到模块映射设置。 - Max MacLeod
@MaxMacLeod 只需在文本编辑器(例如TextWrangler)中创建一个新文件,然后将其拖放到您的项目中。不要忘记选择目标。 - Michael Kork.
添加了module.map后,是否对应用程序的归档也有效?我可以解决“包含非模块头文件”的问题。但是当我归档项目时,它找不到桥接头文件,抱怨缺少头文件。当我检查派生数据中发布版本的构建文件夹时,我没有看到任何头文件。在添加module map之前存在。有什么想法吗?我正在使用Xcode 10。 - SSuman99

2
Proto.framework的构建设置中,尝试将选项允许在框架模块中包含非模块化内容设置为

Xcode Settings


刚试了一下,仍然出现错误:在框架模块Proto中包含非模块化标头 :\ - jbrennan
我也有同样的问题(xcode 7,swift 2)。有人找到解决方案了吗? - AlexDM0
我不得不将我在伞头文件中导入的附加头文件公开化。 - Pranav Kasetti

0

我通过将头文件设置为Public(而不是Project)来解决了这个错误。

前往目标Build Phases并相应地移动头文件:

Header visibility settings

这适用于我的“lib”目标。但我仍然无法构建libTests目标。这里我收到2个错误:
  • 使用include时未找到“header.h”文件;请改用“引号”
  • 再次:在框架模块“lib”内包含非模块化头文件

这个问题我还没有解决


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接