29

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

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

我从来没有见过这个,它不是我的第一个静态库。所以我想我可能与我只使用 Swift 类的事实有关。

你们有什么感想 ?先感谢您。

4

4 回答 4

21

如前所述,从 Xcode 9 Beta 4 开始,Apple确实允许在静态库中使用 Swift。

我们尝试在现有项目上执行此操作,该项目具有基于 Objective-C 的目标和“子”静态库项目,但一直遇到链接错误

ld: library not found for -lswiftSwiftOnoneSupport for architecture x86_64

ld: library not found for -lswiftDispatch for architecture x86_64

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

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

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

您仍然应该记住,在同一个静态库中使用 Swift 和 Objective-C 可能有其自身的问题。我建议阅读Apple 开发人员文档“Swift and Objective-C in the Same Project”,了解如何解决将 Objective-C 导入 Swift(使用桥接头)以及如何在 Objective-C 代码中使用 Swift 文件(导入-Swift.h为您的图书馆生成)。

于 2017-11-16T20:41:02.257 回答
16

Swift 不支持静态库

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

于 2015-04-16T14:36:35.507 回答
11

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

于 2017-08-20T18:47:00.283 回答
10

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

构建库 - ⌘ Command+BProduct -> Build

注意 1:确保为与客户端代码相同的流程架构构建库。注意 2:使用或访问修饰符
公开您的 API 应该对消费者可见[关于]publicopen

查找生成的输出[构建位置]

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

目录包括

  • lib<product_name>.a- 一个内置的静态库
  • <product_name>.swiftmodule. swiftmodule描述库的接口和编译器版本。该文件夹包括:
  • .swiftdoc- 文档
  • .swiftmodule- 公共接口/定义

使用 Swift 静态库的 Swift 消费者

Drag and drop将二进制文件放入 Xcode 项目[关于]

Link Binary[未定义符号] [链接与嵌入]

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)[找不到库] [递归路径]

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【无此模块】 【递归路径】

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

将模块导入 Swift 客户端代码[module_name]

import module_name

[更多示例]

于 2019-04-29T08:29:20.317 回答