我想在swift中使用我的webrtc .a静态库。你能帮帮忙吗?我读过你不能在swift中使用静态库,这是真的吗?
答案 0 :(得分:33)
你问过这个问题吗?我今天也遇到了这个问题,我已经解决了一下。如果您还没有解决此问题,可以尝试以下步骤:
p.s。:2个项目位于同一个工作区(静态lib项目和App项目)中,静态lib项目是在app项目之前构建的。工作区结构如图所示:
- 在静态lib项目中,所有.h文件都需要添加到"构建阶段/复制文件":
醇>
- 将静态lib产品文件(.a文件)拖到app项目,请参阅图片:
醇>(路径:" app project / Build Phase / Link Binary with Libraries")
*如果您关心.a文件的红色标记,您只需选择"通用iOS设备"作为构建设备重新构建静态lib项目,并将.a重新拖动到app项目(红色可以删除)
- 设置"图书馆搜索路径"在你的app项目中:
醇>
这是项目内置的.a文件路径:$(USER_LIBRARY_DIR)/ Developer / Xcode / DerivedData / StockApp -fkjqyvsniiauxogkivalcduqeotj / Build / Products / Debug-iphoneos
- 为您的应用项目创建Bridging-Header文件,并在其中导入静态库,在我的情况下,我包含" StaticLib / StaticLib.h"和#34; CommonFoundation / CommonFoundation.h":
醇>
- 将Bridging-Header文件路径添加到" Objective-C Bridging Header"你的app项目:
醇>
答案 1 :(得分:1)
是的,您可以在Swift中使用静态库。转到您的构建阶段,并在" Link Binary With Libraries"并将它们添加到那里。
或者,您可以进入构建设置和搜索路径"附加"图书馆搜索路径"值包括.a文件所在文件夹的路径。
您可以在"标题搜索路径"
下以相同的方式为您的图书馆添加标题还要记住,如果这个库是用Objective-C编写的,那么你需要一个Bridging Header才能在Swift中使用它。
答案 2 :(得分:1)
Xcode 9 使用 Swift 支持的静态库。你可以在Objective-C中使用like。 Xcode Release Notes
Xcode支持包含Swift代码的静态库目标。调试使用Swift静态库的应用程序可能需要一组完整的构建工件,这些工件位于其原始位置
答案 3 :(得分:1)
如果要在App Target中导入代码,则应使用bridging header
文件将Objective-C代码公开给Swift代码。了解更多here
在本文中,我将描述如何将Objective-C静态库导入Swift代码
迅速的使用者-> Objective-C静态库
Xcode版本10.2.1
创建Objective-C静态库或创建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
文件夹,其中包含.h
中的module_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
答案 4 :(得分:1)
在Swift中使用Objective-C类
如果要在App Target中导入代码(在一个项目中混合Swift和Objective-C),则应使用bridging header
文件将Objective-C代码公开给Swift代码。 [Mixing Swift and Objective-C code in a project]
在本文中,我将描述如何将Objective-C静态库导入Swift代码
Xcode版本10.2.1
创建一个库项目或创建一个库目标
File -> New -> Project... -> Cocoa Touch Static Library
//or
Project editor -> Add a Target -> Cocoa Touch Static Library
创建module.modulemap
文件[About]
module module_name {
umbrella header "module_name-umbrella.h"
export *
}
创建module_name-umbrella.h
文件[About],并添加所有.h
对消费者开放的文件
#import "header_1.h"
#import "header_2.h"
将module.modulemap
和module_name-umbrella.h
文件添加到Copy Files
部分[About]中。
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
添加.h
(module_name-umbrella.h
,header_1.h
)[can not do it] [public target membership]
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
构建库-⌘命令 + B 或Product -> Build
注意:确保为与客户端代码相同的流程体系结构构建库。
查找生成的输出[Build location]
Products group -> lib<product_name>.a -> Show in Finder
目录包括
lib<product_name>.a
–内置的静态库include/<product_name>
文件夹,其中包含Copy Files
节中的文件usr/local/include
文件夹,其中包含Headers
部分中的文件。有公共接口/定义
Drag and drop
将二进制文件放入Xcode项目[About]
Link Library
[Undefined symbols] [Link vs Embed]
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
添加Library Search paths
[Library not found for] [Recursive path]
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
[Module not found] [Recursive path]
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`
将模块导入到Swift客户端代码[module_name]
import module_name