静态库和Swift

时间:2015-04-16 13:37:14

标签: ios iphone xcode swift ios8.3

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

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

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

你们觉得怎么样? 提前谢谢。

4 个答案:

答案 0 :(得分:19)

斯威夫特没有support static library

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

答案 1 :(得分:19)

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

我们尝试在具有基于Objective-C的目标和" child"的现有项目上执行此操作。静态库项目并一直遇到链接错误

ld: library not found for -lswiftSwiftOnoneSupport for architecture x86_64

ld: library not found for -lswiftDispatch for architecture x86_64

这是因为主要目标(app)正在尝试仅针对Objective-C构建,并且静态库不告知它需要包含Swift库。这是因为我们Compile Sources的{​​{1}}部分中没有针对应用目标的任何Swift文件。

所以基本上你只需要在该编译列表中添加至少一个Build Phases文件,它将包含Swift库。它甚至不需要包含任何代码或值,它可以是一个空文件。

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

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

答案 2 :(得分:9)

从Xcode 9 beta 4开始,Xcode本身支持使用Swift源的静态库。

答案 3 :(得分:0)

Swift使用者-> Swift静态库

Xcode版本10.2.1

创建Swift静态库或创建Swift静态库Target

创建一个图书馆项目

File -> New -> Project... -> Cocoa Touch Static Library -> Enter necessary information and choose Language -> Swift

构建库并查找生成的输出(确保为与客户端代码相同的流程体系结构构建库)。 默认情况下,它将位于DerivedData文件夹的子文件夹中。(如果在开发过程中删除DerivedData,然后重新构建,则可以更改它

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

目录包括

  • lib<module_name>.a –内置的静态库
  • .swiftmodule文件夹,其中--.swiftdoc-文档和.swiftmodule文件-公共接口/定义

使用Swift静态库

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

添加Import Paths

Project editor -> select a target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths -> add path to the parent of `.swiftmodule` folder
  • 设置path时,可以定义到父文件夹之一的路径并设置recursive/**将添加到路径的末尾)。例如,您可以使用path参数将Build删除到recursive目录中。
  • 如果patch包含空格-,则应使用\对其进行转义,或者将路径用双引号""

将模块导入到Swift客户端代码

import module_name

Objective-C consumer -> Objective-C static library

Swift consumer -> Objective-C static library

Objective-C consumer -> Swift static library