如何在Swift中使用.a静态库?

40

我希望在Swift中使用我的WebRTC .a静态库。你能帮忙吗?我读到说在Swift中无法使用静态库,这是真的吗?


2
您可以在Swift中使用静态库,但是您无法从Swift中创建静态库。 - nhgrif
那不正确。您可以创建静态库。我甚至将Swift代码与某些静态库链接以创建单个.a文件。 - Wizard of Kneup
只需创建一个 module.modulemap 文件并包含伞头文件。确保它能被 Swift 编译器找到(例如,将 module.modulemap 添加到 "拷贝文件" 的构建阶段,并与 ObjC 头文件一起处理)。 - Vlad
1
请@Vlad提供更多细节。 - Abuzeid
4个回答

46

你解决了之前问的这个问题吗?今天我也遇到了同样的问题,但我很快就解决了。如果你还没有解决这个问题,可以尝试以下步骤:

注:两个项目在同一工作区中(静态库项目和应用程序项目),静态库项目在应用程序项目之前构建。工作区结构如图所示:

/Users/raniys/Desktop/Screen Shot 2016-03-14 at 5.27.20 PM.png

  1. 在静态库项目中,所有的.h文件都需要添加到“Build Phases/Copy Files”中:

enter image description here

  1. 将静态库产品文件(.a文件)拖动到应用程序项目中,参见图片:

(路径:“应用程序项目/Build Phases/Link Binary With Libraries”)

enter image description here

*如果你关心.a文件的红色标记,你只需选择“通用 iOS 设备”作为构建设备,重新构建静态库项目,然后重新将.a拖到应用程序项目中(红色的那个可以删除)

  1. 在你的应用程序项目中设置“Library Search Path”:

在此输入图片描述

这是项目构建的 .a 文件路径:$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/StockApp-fkjqyvsniiauxogkivalcduqeotj/Build/Products/Debug-iphoneos

  1. 为您的应用程序项目创建 Bridging-Header 文件,并在其中导入静态库,在我的情况下,我包括了 "StaticLib/StaticLib.h" 和 "CommonFoundation/CommonFoundation.h":

在此输入图片描述

  1. 将 Bridging-Header 文件路径添加到您的应用程序项目的“Objective-C Bridging Header”中:

在此输入图片描述

然后就完成了,现在您可以使用静态库的函数了。 在此输入图片描述


9

*在Swift中使用Objective-C类

如果您要在应用程序目标中导入代码(将Swift和Objective-C混合在一个项目中),则应使用桥接头文件将Objective-C代码暴露给Swift代码。

[在项目中混合Swift和Objective-C代码]

在本文中,我将描述如何将Objective-C静态库导入到Swift代码中

Swift消费者 -> Objective-C静态库

Xcode版本10.2.1

1.创建Objective-C静态库

创建库项目或创建库目标

File -> New -> Project... -> Cocoa Touch Static Library
//or
Project editor -> Add a Target -> Cocoa Touch Static Library 

创建 module.modulemap 文件,参见[说明]
module module_name {
    umbrella header "module_name-umbrella.h"
    export *
}

创建一个名为 module_name-umbrella.h 的文件[关于],并添加所有将提供给使用者的.h文件。
#import "header_1.h"
#import "header_2.h"

module.modulemapmodule_name-umbrella.h文件添加到Copy Files部分中。[关于]
Project editor -> select a target -> Build Phases -> Copy Files -> add `module.modulemap`, `module_name-umbrella.h` 

添加实现文件 .m

Select `.m` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files

添加在module_name-umbrella.h中列出的头文件.h(header_1.h, header_2.h)[无法完成][公共目标成员]

Select `.h` file -> Select File Inspectors Tab -> Target Membership -> Select the target and make it **public**
//or
Project editor -> select a target -> Build Phases -> Headers -> add files to the **public** zone

构建库 - ⌘ Command + B产品 -> 构建

注意:确保将库的构建与客户端代码使用相同的进程架构。

查找生成的输出[构建位置]

Products group -> lib<product_name>.a -> Show in Finder

该目录包括:
  • lib<product_name>.a – 一个已构建的静态库
  • include/<product_name> 文件夹,其中包含来自复制文件(Copy Files)部分的文件
  • usr/local/include 文件夹,其中包含来自头文件(Headers)部分的文件。这些是公共接口/定义

2. Swift消费者与Objective-C静态库

将二进制文件拖放到 Xcode 项目中[关于]

链接库(Link Library)[未定义符号] [链接 vs 嵌入]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

添加库搜索路径[找不到库][递归路径]
Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

添加Header Search Paths[未找到模块] [递归路径]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `include/<product_name>` folder with `module.modulemap` and `<product_name>-umbrella.h`

3. 在Swift中使用Objective-C静态库

在Swift客户端代码中导入模块[module_name]

import module_name

[这里有更多例子]


非常感谢您提供的详细解释 @yoAlex5。 - Cloy
嘿,如果我的项目要转换为库不是纯的Objective C,而是Objective C和Swift的混合物,我们该如何处理呢?因此,库无法编译,因为在每个导入“ProjectName-Swift.h”的文件上都会显示错误。在那一行出现“找不到Project-Swift.h文件”的错误。 - Khushabu

2
是的,你可以在Swift中使用静态库。前往你的Build Phases,在“Link Binary With Libraries”下面添加它们即可。

enter image description here

或者,您可以在“构建设置”下,将“搜索路径”中的“库搜索路径”值附加到包含您的 .a 文件所在文件夹的路径中。

enter image description here

您可以在“头文件搜索路径”下以相同的方式为您的库添加标题。
另外请注意,如果这个库是用Objective-C编写的,您需要一个桥接头文件才能在Swift中使用它。

@jchnxu 你是否因为Xcode找不到模块的头文件而出现了错误?如果你的路径在头文件搜索路径中添加递归选项,或许可以让Xcode递归进入.a模块。 - Cole

1

使用 Xcode 9,支持使用静态库编写 Swift 代码。您可以像在 Objective-C 中一样使用它。Xcode Release Notes

Xcode 支持包含 Swift 代码的静态库目标。调试使用 Swift 静态库的应用程序可能需要完整的构建工件集,这些工件集位于其原始位置。


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