静态库和Swift

Que*_*e20 23 iphone xcode ios 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类这一事实有关.

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

Dea*_*lly 19

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

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

ld: library not found for -lswiftSwiftOnoneSupport for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

ld: library not found for -lswiftDispatch for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

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

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

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

您仍应记住,在同一静态库中使用Swift和Objective-C 可能会有自己的问题.我建议阅读Apple开发人员文档"同一项目中的Swift和Objective-C",了解如何解决将Objective-C导入Swift(使用桥接头)以及如何在Objective-C代码中使用Swift文件(导入-Swift.h为您的图书馆生成).

  • 太棒了,只需添加一个空的Swift文件,所有这些错误都会消失.谢谢您的帮助! (2认同)

Gio*_*lzo 18

Swift不支持静态库

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

  • 不.仍然没有. (4认同)
  • 这很烦人.谢谢您的回答. (3认同)
  • 嗨,因为swift不支持静态库,我怎么能阻止我的同事阅读我的代码呢?(这是关于加密数据,所以知道的人越多越好).我的应用程序也支持ios 7,所以我想我不能使用框架,对吧? (3认同)
  • 到目前为止可能需要更新?swift 现在支持框架和静态库吗? (2认同)

Ale*_*dro 11

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

  • 我该怎么做才能启用它?当使用包含swift的静态库时,如何从objective-c项目访问头文件? (5认同)

yoA*_*ex5 7

Swift使用者-> Swift静态库

Xcode版本10.2.1

创建Swift静态库

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

File -> New -> Project... -> Cocoa Touch Static Library
//or
Project editor -> Add a Target -> Cocoa Touch Static Library 
Run Code Online (Sandbox Code Playgroud)

新增档案 .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
Run Code Online (Sandbox Code Playgroud)

构建库- ? Command+ BProduct -> Build

注1:确保为与客户端代码相同的流程体系结构构建库。
注意2:公开您的API,以供使用publicopen访问修饰符显示给消费者的[关于]

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

Products group -> lib<product_name>.a -> Show in Finder
Run Code Online (Sandbox Code Playgroud)

该目录包括

  • lib<product_name>.a –内置的静态库
  • <product_name>.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
Run Code Online (Sandbox Code Playgroud)

添加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
Run Code Online (Sandbox Code Playgroud)

添加Import Paths[没有这样的模块] [递归路径]

Project editor -> select a target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths -> add path to a folder with `.swiftmodule`
Run Code Online (Sandbox Code Playgroud)

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

import module_name
Run Code Online (Sandbox Code Playgroud)

[更多示例]

  • @yoAlex5,非常感谢您详细而全面的解释。我唯一想补充的是,您不要忘记将您的类和方法标记为“public”,以使它们在其他目标中可用。如果没有它,您将能够导入该库,但无法使用其代码。另外,请注意 `init` 必须**明确**公开。 (3认同)

归档时间:

查看次数:

27862 次

最近记录:

5 年,10 月 前