静态库和 Swift

Static Library and Swift

所以我正在 Swift 中进行一个 iOS 项目,我想创建一个包含一些有用内容的静态库。

我的问题是,当我尝试在 Xcode(版本 6.3)中构建我的库时,我有一个 "Build Failed",后跟:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: unknown option character 'X' in: -Xlinker

我从未见过这个,这不是我的第一个静态库。所以我想我可能与我只使用 Swift class.

这一事实有关

大家怎么看? 提前谢谢你。

Swift 没有 support static library

虽然正确的方法应该是创建一个框架,但有一个解决方法 here

从 Xcode 9 beta 4 开始,Xcode 原生支持具有 Swift 源的静态库。

如前所述,自 Xcode 9 Beta 4 起,Apple 允许在静态库中使用 Swift。

我们试图在具有 Objective-C-based 目标和 "child" 静态库项目的现有项目上执行此操作,并使 运行 陷入链接错误

ld: library not found for -lswiftSwiftOnoneSupport for architecture x86_64

还有

ld: library not found for -lswiftDispatch for architecture x86_64

这是因为主要目标(应用程序)试图仅针对 Objective-C 进行构建,而静态库并未告知它需要包含 Swift 库。这是因为在我们的 Build Phases 应用程序目标的 Compile Sources 部分中没有任何 Swift 文件。

所以基本上你所要做的就是至少添加一个.swift文件到那个编译列表,它会为你包含Swift库.它甚至不需要包含任何代码或值,它可以是一个空文件。

然后您可以开始将 Swift 文件添加到您的 "child" 静态库项目中。我会让它首先为您生成桥接 header 然后您可以移动它并更改导入的内容(如果您移动它,请确保项目指向构建设置中的正确文件)。

您仍然应该记住,在 相同的 静态库中使用 Swift 和 Objective-C 可能有其自身的问题。我建议阅读 the Apple developer doc "Swift and Objective-C in the Same Project" 如何解决将 Objective-C 导入 Swift(使用桥接 header)以及如何在 [=40] 中使用 Swift 文件=] 代码(为您的库导入生成的 -Swift.h)。

Swift消费者->Swift静态库

Xcode 版本 10.2.1

创建Swift静态库

创建库项目或创建库目标

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

添加文件.swift

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

构建库 - ⌘ 命令 + BProduct -> Build

注意 1:确保您为与客户端代码相同的进程架构构建库。
注意 2:使用 publicopen 访问修饰符 [About]

公开你的 API 应该对消费者可见

查找生成的输出[Build location]

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

目录包括

  • lib<product_name>.a – 内置静态库
  • <product_name>.swiftmoduleswiftmodule 描述一个库的接口和一个编译器版本。此文件夹包括:
  • .swiftdoc - 文档
  • .swiftmodule - public interface/definitions

Swift 使用 Swift 静态库的消费者

Drag and drop二进制文件进入Xcode项目[About]

Link Binary[Undefined symbols]

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

添加Library Search paths(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<target_name>.a` file

添加Import Paths [Recursive path]

Project editor -> select a target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths -> add path to a folder with `.swiftmodule`

将模块导入 Swift 客户端代码

import module_name

[More examples]