Swift 在 Linux 上:做好第一步工作
Swift on Linux: Make very first step work
我对 swift 完全陌生。它刚刚作为 linux 的开源发布,我想尝试一下。这是在 ubuntu 14.04 上。 clang 是根据先决条件安装的。
<Edit>
:requirements here 也在 ubuntu 14.04 上请求 clang 版本 3.6。我首先使用 clang 3.4 尝试了这些第一步,但后来按照 link 中的说明更新到 3.6 并重试。同样的结果。</Edit>
我已将 https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz 下载到 ~/Downloads/。 swift 中安装和第一步的记录:
$ cd /tmp
$ tar xf ~/Downloads/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
$ PATH=/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/bin/:"$PATH"
$ clang++ --version
Ubuntu clang version 3.6.0-2ubuntu1~trusty1 (tags/RELEASE_360/final) (based on LLVM 3.6.0)
Target: x86_64-pc-linux-gnu
Thread model: posix
$ which swift
/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/bin//swift
$ swift --version
Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c)
Target: x86_64-unknown-linux-gnu
$ swift
Welcome to Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c). Type :help for assistance.
1> 1 + 2
opening import file for module 'SwiftShims': No such file or directory
1>
根据 this getting started guide 它应该打印出来
$R0: Int = 3
出了什么问题,我该如何解决?
编辑:尝试手动查找该文件:它显然不包含在安装中:
$ find swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/ | grep -i shims
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/FoundationShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/SwiftStddef.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/module.map
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/UnicodeShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/GlobalObjects.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/HeapObject.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/RuntimeShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/RefCount.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/RuntimeStubs.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/LibcShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/CoreFoundationShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/SwiftStdint.h
编辑:当我尝试 swift build
helloworld example 时,会产生以下输出:
/tmp/Hello$ swift build
<unknown>:0: error: opening import file for module 'Swift': No such file or directory
swift-build: exit(1): ["/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/bin/swiftc", "--driver-mode=swift", "-I", "/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/pm", "-L", "/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/pm", "-lPackageDescription", "/tmp/Hello/Package.swift"]
编辑:截至 2015 年 12 月 22 日的新发现
自从我发布这个问题后,至少发布了 swift 的 linux 的两个快照:2015-12-10 和 2015-12-18。我试过这些,但它们没有解决问题。
此处的邮件列表线程 (post 1, post 2, post 3) 与同一问题有关。有人建议在主目录下安装 swift 会有帮助。它对我的情况没有帮助,错误消息仍然相同。
更有趣的是,该邮件列表线程包含 an analysis of the REPL error created with strace。将特定的 strace 输出与 REPL 工作的系统的 strace 输出进行比较会很有趣。
编辑:截至 2015 年 12 月 26 日的更多信息:
新的 swift 版本已发布,日期为 2015 年 12 月 22 日。此版本存在同样的问题。
swift 邮件列表 starting here. The user experiencing the problem has also posted strace output here 上出现了另一个关于此问题的帖子。
我在全新的 Ubuntu 14.04 Azure VM 上重复了您描述的相同步骤并得到了预期的
$R0: Int = 3
有趣的是,即使没有 Clang 或 GCC,它也能正常工作!后来我安装了 Clang-3.5,也可以用。
他们有没有可能偷偷加入了同名的新压缩包?我得到的那个的 MD5 散列在这里:
user@ubuntu1:/tmp/junk$ md5sum swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
a93f52921c491b747cad256904c8742f swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
你的匹配吗?如果是这样,如果您有权访问 Ubuntu 14.04,您可能想尝试不同的安装。
我也能够按照 https://swift.org/getting-started/#using-the-build-system 中的说明成功使用 swift build
。正如我所怀疑的那样,删除 clang-3.5 包损坏了 swift build
,但是 REPL swift 仍然像最初那样工作,在第一次安装 Clang 之前。然后我安装了 Clang-3.4,然后 swift build
恢复正常了。
2016 年 1 月 3 日更新:
根据对这个问题的各种评论的提示,我已经能够在我的 Ubuntu 14.04 Azure VM 上重现错误。作为替代解决方案,该问题也可以通过操纵 $LD_LIBRARY_PATH
来解决,请参阅 Unable to compile "hello world" program with Swift on Ubuntu 14.04。
这不是真正的答案——我和 OP 有同样的问题——但 SwiftShims
实际上定义了上面列出的文件中的 module.map
文件:
module SwiftShims {
header "CoreFoundationShims.h"
header "FoundationShims.h"
header "GlobalObjects.h"
header "HeapObject.h"
header "LibcShims.h"
header "RefCount.h"
header "RuntimeShims.h"
header "RuntimeStubs.h"
header "SwiftStddef.h"
header "SwiftStdint.h"
header "UnicodeShims.h"
export *
}
有同样的问题,我错过的是我没有得到包的密钥并在提取之前验证它。
- 下载包
wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import
gpg --keyserver hkp://pool.sks-keyservers.net --refresh-keys Swift
gpg --verify swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz.sig
tar xzf swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
- 将
PATH=/path/to/usr/bin:"${PATH}"
添加到您的 .bashrc
- 终于运行
swift
你应该看到:
Welcome to Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c). Type :help for assistance.
1> 1+1
$R0: Int = 2
我遇到了完全相同的问题。事实证明,我添加了 ppa:ubuntu-toolchain-r/test 存储库以便在我的 Mint 发行版 (17.2) 上安装 g++-4.9。一旦我清除了存储库并将各种库恢复到它们的原始版本,swift 终于对我有用了。
具体来说,我必须 运行
sudo apt-get install ppa-purge
sudo ppa-purge -d trusty ppa:ubuntu-toolchain-r/test
清理时,ppa-purge 抱怨说为了解决冲突,它必须删除很多在 Ubuntu Trusty 仓库中找不到的包(包括真正的核心包)像 build-essential、xorg、gcc、x11-xserver-utils...),所以我记下并在清除后立即重新安装这些。只是要非常小心。
我认为安装 g++ 4.9 时覆盖的一些库会造成冲突。我也在新安装的 Mint 上验证了所有这些。
根据 James D 的建议,我尝试 运行
sudo apt-get install ppa-purge
sudo ppa-purge -d trusty ppa:ubuntu-toolchain-r/test
但是,这没有用。奇怪的是,所做的 工作没有意义。对我来说,我通过先 安装 上面的 ppa 然后清除它来让它工作。让我工作的整个命令集是
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.9 # This step may be optional
sudo apt-get install ppa-purge
sudo ppa-purge -d trusty ppa:ubuntu-toolchain-r/test
我对 swift 完全陌生。它刚刚作为 linux 的开源发布,我想尝试一下。这是在 ubuntu 14.04 上。 clang 是根据先决条件安装的。
<Edit>
:requirements here 也在 ubuntu 14.04 上请求 clang 版本 3.6。我首先使用 clang 3.4 尝试了这些第一步,但后来按照 link 中的说明更新到 3.6 并重试。同样的结果。</Edit>
我已将 https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz 下载到 ~/Downloads/。 swift 中安装和第一步的记录:
$ cd /tmp
$ tar xf ~/Downloads/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
$ PATH=/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/bin/:"$PATH"
$ clang++ --version
Ubuntu clang version 3.6.0-2ubuntu1~trusty1 (tags/RELEASE_360/final) (based on LLVM 3.6.0)
Target: x86_64-pc-linux-gnu
Thread model: posix
$ which swift
/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/bin//swift
$ swift --version
Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c)
Target: x86_64-unknown-linux-gnu
$ swift
Welcome to Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c). Type :help for assistance.
1> 1 + 2
opening import file for module 'SwiftShims': No such file or directory
1>
根据 this getting started guide 它应该打印出来
$R0: Int = 3
出了什么问题,我该如何解决?
编辑:尝试手动查找该文件:它显然不包含在安装中:
$ find swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/ | grep -i shims
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/FoundationShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/SwiftStddef.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/module.map
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/UnicodeShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/GlobalObjects.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/HeapObject.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/RuntimeShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/RefCount.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/RuntimeStubs.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/LibcShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/CoreFoundationShims.h
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/shims/SwiftStdint.h
编辑:当我尝试 swift build
helloworld example 时,会产生以下输出:
/tmp/Hello$ swift build
<unknown>:0: error: opening import file for module 'Swift': No such file or directory
swift-build: exit(1): ["/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/bin/swiftc", "--driver-mode=swift", "-I", "/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/pm", "-L", "/tmp/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/lib/swift/pm", "-lPackageDescription", "/tmp/Hello/Package.swift"]
编辑:截至 2015 年 12 月 22 日的新发现
自从我发布这个问题后,至少发布了 swift 的 linux 的两个快照:2015-12-10 和 2015-12-18。我试过这些,但它们没有解决问题。
此处的邮件列表线程 (post 1, post 2, post 3) 与同一问题有关。有人建议在主目录下安装 swift 会有帮助。它对我的情况没有帮助,错误消息仍然相同。
更有趣的是,该邮件列表线程包含 an analysis of the REPL error created with strace。将特定的 strace 输出与 REPL 工作的系统的 strace 输出进行比较会很有趣。
编辑:截至 2015 年 12 月 26 日的更多信息:
新的 swift 版本已发布,日期为 2015 年 12 月 22 日。此版本存在同样的问题。
swift 邮件列表 starting here. The user experiencing the problem has also posted strace output here 上出现了另一个关于此问题的帖子。
我在全新的 Ubuntu 14.04 Azure VM 上重复了您描述的相同步骤并得到了预期的
$R0: Int = 3
有趣的是,即使没有 Clang 或 GCC,它也能正常工作!后来我安装了 Clang-3.5,也可以用。
他们有没有可能偷偷加入了同名的新压缩包?我得到的那个的 MD5 散列在这里:
user@ubuntu1:/tmp/junk$ md5sum swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
a93f52921c491b747cad256904c8742f swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
你的匹配吗?如果是这样,如果您有权访问 Ubuntu 14.04,您可能想尝试不同的安装。
我也能够按照 https://swift.org/getting-started/#using-the-build-system 中的说明成功使用 swift build
。正如我所怀疑的那样,删除 clang-3.5 包损坏了 swift build
,但是 REPL swift 仍然像最初那样工作,在第一次安装 Clang 之前。然后我安装了 Clang-3.4,然后 swift build
恢复正常了。
2016 年 1 月 3 日更新:
根据对这个问题的各种评论的提示,我已经能够在我的 Ubuntu 14.04 Azure VM 上重现错误。作为替代解决方案,该问题也可以通过操纵 $LD_LIBRARY_PATH
来解决,请参阅 Unable to compile "hello world" program with Swift on Ubuntu 14.04。
这不是真正的答案——我和 OP 有同样的问题——但 SwiftShims
实际上定义了上面列出的文件中的 module.map
文件:
module SwiftShims {
header "CoreFoundationShims.h"
header "FoundationShims.h"
header "GlobalObjects.h"
header "HeapObject.h"
header "LibcShims.h"
header "RefCount.h"
header "RuntimeShims.h"
header "RuntimeStubs.h"
header "SwiftStddef.h"
header "SwiftStdint.h"
header "UnicodeShims.h"
export *
}
有同样的问题,我错过的是我没有得到包的密钥并在提取之前验证它。
- 下载包
wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import
gpg --keyserver hkp://pool.sks-keyservers.net --refresh-keys Swift
gpg --verify swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz.sig
tar xzf swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
- 将
PATH=/path/to/usr/bin:"${PATH}"
添加到您的.bashrc
- 终于运行
swift
你应该看到:
Welcome to Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c). Type :help for assistance.
1> 1+1
$R0: Int = 2
我遇到了完全相同的问题。事实证明,我添加了 ppa:ubuntu-toolchain-r/test 存储库以便在我的 Mint 发行版 (17.2) 上安装 g++-4.9。一旦我清除了存储库并将各种库恢复到它们的原始版本,swift 终于对我有用了。
具体来说,我必须 运行
sudo apt-get install ppa-purge
sudo ppa-purge -d trusty ppa:ubuntu-toolchain-r/test
清理时,ppa-purge 抱怨说为了解决冲突,它必须删除很多在 Ubuntu Trusty 仓库中找不到的包(包括真正的核心包)像 build-essential、xorg、gcc、x11-xserver-utils...),所以我记下并在清除后立即重新安装这些。只是要非常小心。
我认为安装 g++ 4.9 时覆盖的一些库会造成冲突。我也在新安装的 Mint 上验证了所有这些。
根据 James D 的建议,我尝试 运行
sudo apt-get install ppa-purge
sudo ppa-purge -d trusty ppa:ubuntu-toolchain-r/test
但是,这没有用。奇怪的是,所做的 工作没有意义。对我来说,我通过先 安装 上面的 ppa 然后清除它来让它工作。让我工作的整个命令集是
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.9 # This step may be optional
sudo apt-get install ppa-purge
sudo ppa-purge -d trusty ppa:ubuntu-toolchain-r/test