静态库和 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
构建库 - ⌘ 命令 + B 或 Product -> Build
注意 1:确保您为与客户端代码相同的进程架构构建库。
注意 2:使用 public
或 open
访问修饰符 [About]
公开你的 API 应该对消费者可见
查找生成的输出[Build location]
Products group -> lib<product_name>.a -> Show in Finder
目录包括
lib<product_name>.a
– 内置静态库
<product_name>.swiftmodule
。 swiftmodule
描述一个库的接口和一个编译器版本。此文件夹包括:
.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]
所以我正在 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
构建库 - ⌘ 命令 + B 或 Product -> Build
注意 1:确保您为与客户端代码相同的进程架构构建库。
注意 2:使用 public
或 open
访问修饰符 [About]
查找生成的输出[Build location]
Products group -> lib<product_name>.a -> Show in Finder
目录包括
lib<product_name>.a
– 内置静态库<product_name>.swiftmodule
。swiftmodule
描述一个库的接口和一个编译器版本。此文件夹包括:.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
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]