所以我正在使用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类的事实有关。
你们觉得怎么样? 提前谢谢。
答案 0 :(得分:19)
虽然正确的方法应该是创建框架,但有一种解决方法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