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

问题描述 投票:18回答:4

我想在swift中使用我的webrtc .a静态库。你能帮帮忙吗?我读过你不能在swift中使用静态库,这是真的吗?

ios swift static-libraries webrtc
4个回答
33
投票

你问过这个问题吗?我今天也遇到了这个问题,我已经修好了一会儿。如果您没有解决此问题,可以尝试以下步骤:

p.s。:2个项目在同一工作区(静态lib项目和App项目)中,静态lib项目在app项目之前构建。工作区结构如图所示:

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

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

enter image description here

  1. 将静态lib产品文件(.a文件)拖到app项目中,请参阅图片:

(路径:“app project / Build Phase / Link Binary with Libraries”)

enter image description here

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

  1. 在您的应用项目中设置“库搜索路径”:

enter image description here

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

  1. 为您的应用程序项目创建Bridging-Header文件,并在其中导入静态库,在我的例子中,我包含“StaticLib / StaticLib.h”和“CommonFoundation / CommonFoundation.h”:

enter image description here

  1. 将Bridging-Header文件路径添加到您的app项目的“Objective-C Bridging Header”:

enter image description here

然后全部完成,您现在可以使用静态库的功能。 enter image description here


2
投票

如果要在App Target中导入代码,则应使用bridging header文件将Objective-C代码公开给Swift代码。阅读更多here

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

Swift使用者 - > Objective-C静态库

Xcode版本10.2.1

创建Objective-C静态库或Create Objective-C静态库Target

创建一个库项目

File -> New -> Project... -> Cocoa Touch Static Library -> Enter necessary information and choose Language -> Objective-C

创建module.modulemap文件

module module_name {
    umbrella header "module_name-umbrella.h"
    export *
}

.h文件添加到将为消费者开放的module_name-umbrella.h

#import "header_1.h"
#import "header_2.h"

添加复制文件构建阶段

Project editor -> select a target -> Build Phases -> Copy Files -> add `module.modulemap`, `module_name-umbrella.h` 

添加标题

Project editor -> select a target -> Build Phases -> Headers(If it doesn't exist -> + at the top -> New Headers Phase) -> add all `.h` files from `module_name-umbrella.h`(`header_1.h`, `header_2.h`)

构建库

注意:确保为与客户端代码相同的流程体系结构构建库。

查找生成的输出

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

注意:默认情况下,它将位于DerivedData文件夹的子文件夹中(如果您在开发过程中删除DerivedData并重新生成它,则可以更改它)。

该目录包括

  • lib<module_name>.a - 内置静态库
  • module.modulemap文件
  • module_name-umbrella.h文件
  • usr/local/include文件夹,包含来自.hmodule_name-umbrella.h文件 - 公共接口/定义

使用Objective-C静态库

Link Binary With Libraries

Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<module_name>.a` file

添加Library Search paths

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<module_name>.a` file

添加Header Search Paths

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `include` folder (or a path to the parent of generated `module_name` folder with `.h` files)
  • 当您设置path时,您可以定义父文件夹之一的路径并设置recursive/**将添加到路径的末尾)。例如,您可以使用path参数将Build污染到recursive目录。
  • 如果patch包含空格 - ,你应该使用\来逃避它们或用双引号""封闭路径

将模块导入Swift客户端代码

import module_name

Objective-C consumer -> Objective-C static library

Swift consumer -> Swift static library

Objective-C consumer -> Swift static library


1
投票

是的,您可以在Swift中使用静态库。转到“构建阶段”并在“使用库链接二进制文件”下将其添加到那里。

enter image description here

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

enter image description here

您可以在“标题搜索路径”下以相同的方式为库添加标题

还要记住,如果这个库是用Objective-C编写的,那么你需要一个Bridging Header才能在Swift中使用它。


1
投票

使用Xcode 9使用Swift支持的静态库。你可以在Objective-C中使用like。 Xcode Release Notes

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

© www.soinside.com 2019 - 2024. All rights reserved.