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

时间:2015-08-20 18:06:27

标签: ios swift static-libraries webrtc

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

5 个答案:

答案 0 :(得分: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文件都需要添加到"构建阶段/复制文件":
  2.   

enter image description here

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

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

enter image description here

  

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

     
      
  1. 设置"图书馆搜索路径"在你的app项目中:
  2.   

enter image description here

  

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

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

enter image description here

  
      
  1. 将Bridging-Header文件路径添加到" Objective-C Bridging Header"你的app项目:
  2.   

enter image description here

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

答案 1 :(得分:1)

是的,您可以在Swift中使用静态库。转到您的构建阶段,并在" Link Binary With Libraries"并将它们添加到那里。

enter image description here

或者,您可以进入构建设置和搜索路径"附加"图书馆搜索路径"值包括.a文件所在文件夹的路径。

enter image description here

您可以在"标题搜索路径"

下以相同的方式为您的图书馆添加标题

还要记住,如果这个库是用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

Swift consumer -> Swift static library

Objective-C consumer -> Swift 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代码

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

Xcode版本10.2.1

创建Objective-C静态库

创建一个库项目或创建一个库目标

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.modulemapmodule_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

添加.hmodule_name-umbrella.hheader_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部分中的文件。有公共接口/定义

具有Objective-C静态库的快速使用者

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

More examples here