Swift on Linux - 导入第三方模块

dav*_*idA 6 linux import swift

我正在Linux上编写一些入门级的swift代码作为学习练习.

作为一般任务,我希望在我自己的代码中使用第三方Swift模块.我们称这个模块为"Foo".Foo模块有一个Package.swift文件,swift build在该目录中运行后,它已经创建.build/debug/libFoo.so.

现在我想做两件事:

  1. 能够import Foo在REPL中.
  2. 能够在我自己的swift程序中导入Foo,可能是通过链接这个共享对象.

我觉得这两个任务都是相关的,所以现在它们都是同一个问题.

对于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)

我曾希望这可行.

Ana*_*i P 1

正如文档中所述,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)