我希望在Swift中使用我的WebRTC .a静态库。你能帮忙吗?我读到说在Swift中无法使用静态库,这是真的吗?
我希望在Swift中使用我的WebRTC .a静态库。你能帮忙吗?我读到说在Swift中无法使用静态库,这是真的吗?
你解决了之前问的这个问题吗?今天我也遇到了同样的问题,但我很快就解决了。如果你还没有解决这个问题,可以尝试以下步骤:
注:两个项目在同一工作区中(静态库项目和应用程序项目),静态库项目在应用程序项目之前构建。工作区结构如图所示:
- 在静态库项目中,所有的.h文件都需要添加到“Build Phases/Copy Files”中:
- 将静态库产品文件(.a文件)拖动到应用程序项目中,参见图片:
(路径:“应用程序项目/Build Phases/Link Binary With Libraries”)
*如果你关心.a文件的红色标记,你只需选择“通用 iOS 设备”作为构建设备,重新构建静态库项目,然后重新将.a拖到应用程序项目中(红色的那个可以删除)
- 在你的应用程序项目中设置“Library Search Path”:
这是项目构建的 .a 文件路径:$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/StockApp-fkjqyvsniiauxogkivalcduqeotj/Build/Products/Debug-iphoneos
- 为您的应用程序项目创建 Bridging-Header 文件,并在其中导入静态库,在我的情况下,我包括了 "StaticLib/StaticLib.h" 和 "CommonFoundation/CommonFoundation.h":
- 将 Bridging-Header 文件路径添加到您的应用程序项目的“Objective-C Bridging Header”中:
*在Swift中使用Objective-C类
如果您要在应用程序目标中导入代码(将Swift和Objective-C混合在一个项目中),则应使用桥接头文件
将Objective-C代码暴露给Swift代码。
在本文中,我将描述如何将Objective-C静态库导入到Swift代码中
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.modulemap
和module_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
使用 Xcode 9,支持使用静态库编写 Swift 代码。您可以像在 Objective-C 中一样使用它。Xcode Release Notes
Xcode 支持包含 Swift 代码的静态库目标。调试使用 Swift 静态库的应用程序可能需要完整的构建工件集,这些工件集位于其原始位置。
module.modulemap
文件并包含伞头文件。确保它能被 Swift 编译器找到(例如,将module.modulemap
添加到 "拷贝文件" 的构建阶段,并与 ObjC 头文件一起处理)。 - Vlad