dav*_*idA 6 linux import swift
我正在Linux上编写一些入门级的swift代码作为学习练习.
作为一般任务,我希望在我自己的代码中使用第三方Swift模块.我们称这个模块为"Foo".Foo模块有一个Package.swift文件,swift build在该目录中运行后,它已经创建.build/debug/libFoo.so.
现在我想做两件事:
import Foo在REPL中.我觉得这两个任务都是相关的,所以现在它们都是同一个问题.
对于1.,我不明白包裹如何被REPL"找到".我试过,swift -F .build/debug -framework Foo但我得到"没有这样的模块"错误.我也试过swift -I .build/debug了同样的结果.
对于2,我检查swiftc --help并有-L和-l可选项,但我没能找到使用这些正确的方法:
$ swiftc main.swift -L ../foo.git/.build/debug -llibFoo.so
main.swift:1:8: error: no such module 'Foo'
import Foo
^
Run Code Online (Sandbox Code Playgroud)
我正在使用/ Swift 2.2或3.0(使用swim而不是swift build2.2,因为没有swift build- 但它产生相同的输出,我相信).
请注意,我理解swift build可以自动下载和构建第三方模块,但我想知道如何合并磁盘模块,因为它们可能是我自己的工作进度模块.
编辑:我尝试了一个基于发现的swift3的小实验,你可以使用本地路径作为url:Package dependencies:列表中的参数,至少对于本地开发.
我创建了一个目录Bar并Bar/Package.swift:
import PackageDescription
let package = Package(name: "Bar")
Run Code Online (Sandbox Code Playgroud)
我还创建了Bar/Sources/bar.swift包含:
public func bar(arg: Int) -> Int {
return arg * 2
}
Run Code Online (Sandbox Code Playgroud)
目的是该模块Bar提供被调用的函数bar(arg:).
我做了git init,git add .,git commit -m "Initial commit."然后git tag 1.0.0创建一个标签的地方该模块混帐回购协议.
然后返回顶层我创建的目录Foo和Foo/Package.swift:
import PackageDescription
let package = Package(
name: "Foo",
dependencies: [ .Package(url: "../Bar", majorVersion: 1) ]
)
Run Code Online (Sandbox Code Playgroud)
注意相对路径../Bar.
我还创建了Foo/Sources/main.swift:
import Bar
print(bar(arg: 11))
Run Code Online (Sandbox Code Playgroud)
现在当我swift build进入内部时Foo,它会克隆Bar并构建它.然而,我得到以下错误; 没有这样的模块:
$ swift build
Compile Swift Module 'Bar' (1 sources)
Compile Swift Module 'Foo' (1 sources)
.../Foo/Sources/main.swift:1:8: error: no such module 'Bar'
import Bar
^
<unknown>:0: error: build had 1 command failures
error: exit(1): .../swift-3.0-PREVIEW-4-ubuntu14.04/usr/bin/swift-build-tool -f .../Foo/.build/debug.yaml
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我再次执行完全相同的构建命令,我会得到一个不同的错误:
$ swift build
Compile Swift Module 'Foo' (1 sources)
Linking .build/debug/Bar
.../Foo/Sources/main.swift:3:7: error: use of unresolved identifier 'bar'
print(bar(arg: 11))
^~~
<unknown>:0: error: build had 1 command failures
error: exit(1): .../swift-3.0-PREVIEW-4-ubuntu14.04/usr/bin/swift-build-tool -f .../Foo/.build/debug.yaml
Run Code Online (Sandbox Code Playgroud)
我曾希望这可行.
正如文档中所述,Linux 上的 Swift 及其包管理器正在开发中,因此存在错误和信息缺乏也就不足为奇了。然而,这是我通过实验和阅读帮助发现的。
如果模块Foo有一个库 、libFoo.soin/LibLocation和Foo.swiftmodulein /ModuleLocation,那么就可以Foo在 Swift 程序中导入和使用它,调用它main.swift,然后通过执行以下操作来编译它
swiftc -I /ModuleLocation -L /LibLocation -lFoo main.swift
Run Code Online (Sandbox Code Playgroud)
还可以通过将其启动为 REPL 来完成此操作
swift -I /ModuleLocation -L /LibLocation -lFoo
Run Code Online (Sandbox Code Playgroud)
即本质上给予它与 相同的参数swiftc。顺便说一句,如果模块是使用 构建的swift build,则ModuleLocation可能与LibLocation。
正如我在之前的评论中提到的,您使用Foo和 的示例Bar都使用swift build示例对我来说效果很好,所以我无法重现该问题。
顺便说一句,除了阅读 swift.org 文档和命令行帮助之外,还可以通过运行带有swift build该标志的命令和其他命令来收集大量有趣且可能有用的信息-v。了解swiftcdo可用的一些隐藏选项
swiftc -help-hidden
Run Code Online (Sandbox Code Playgroud)