如何将 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 项目

将现有的objective-c静态库转换为swift

Cocoapod使用Mix和Match Swift和Objective-c代码

Objective-C 在静态库中抛出异常。如何使用该库从程序中捕获异常?

如何在vs中导入静态链接库(lib)?