【问题标题】:Swift on Linux: Make very first step workLinux 上的 Swift:让第一步开始工作
【发布时间】:2015-12-03 23:00:40
【问题描述】:

我对 swift 完全陌生。它刚刚作为 linux 的开源版本发布,我想尝试一下。这是在 ubuntu 14.04 上。 clang 是根据先决条件安装的。

<Edit>: requirements here 在 ubuntu 14.04 上请求 clang 版本 3.6。我首先使用 clang 3.4 尝试了这些第一步,但后来按照链接中的说明更新到 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 for linux 的快照已经发布:2015-12-10 和 2015-12-18。我已经尝试过这些,但它们不能解决问题。

这里的邮件列表线程(post 1post 2post 3)也存在同样的问题。有人建议在主目录下安装 swift 会有所帮助。在我的情况下它没有帮助,错误消息仍然是一样的。

更有趣的是,该邮件列表线程包含an analysis of the REPL error created with strace。将特定的 strace 输出与 REPL 工作的系统的 strace 输出进行比较会很有趣。

编辑:截至 2015 年 12 月 26 日的更多信息:

2015 年 12 月 22 日发布了一个新的 swift 版本。此版本也存在同样的问题。

另一个关于这个问题的帖子已经出现在 swift 邮件列表starting here 上。遇到问题的用户也发布了strace output here

【问题讨论】:

  • @shellter 这是关于让编程环境工作的。当然,这样的问题涉及两个主题,具体的编程环境以及安装它的系统。然而,我的感觉是,懂 Swift 编程的人比懂 Unix 的人更有可能解决这个问题。
  • 是的,防守得很好,也许我有点太仓促了。我撤回了我的近距离投票。祝你好运!
  • 假设您熟悉git,实际上有更好的方法。如果您查看swift.org/source-code 中列出的每个 Github 存储库,您会看到有一个 swift-2.2-branch。克隆swift.org 中详述的所有存储库,然后切换到swift-2.2-branch。然后,您可以随时构建和更新。还有一个与下载匹配的标签,因此您可以构建到与swift.org 下载匹配的特定版本。随着 2.2 版的临近发布,重大更改可能会越来越少。
  • @timbo 感谢您的贡献,但我不得不问:更好的方法来实现什么?我的兴趣是学习 swift,一种新的编程语言。我尝试安装 swift 作为第一步。按照执行安装的说明,我遇到了问题中描述的问题。有时我会尝试新的二进制版本以查看问题是否已解决。到目前为止还不是。从什么意义上说,从源代码构建是一种更好的方法?
  • 当 Swift 接近 2.2 版本并查看内部结构时,这将是一种更好的方法来保持 Swift 的最新状态,但不可否认,这不是从头开始学习它的最佳方法。如果您只是想安装它,必须有人(或一群人)将 Ubuntu 软件包放在一起。一个 HomeBrew 包已经出现在 OS X 上。

标签: linux swift swift2 ubuntu-14.04


【解决方案1】:

我遇到了完全相同的问题。事实证明,我添加了 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 安装中验证了所有这些。

【讨论】:

  • 非常有希望的提示!我没有安装那个 ppa,因为我安装了从源代码构建的 g++-5,并且在 GNU stow 的帮助下,该安装被镜像到 /usr/local。使用“sudo stow -D gcc-5”隐藏该安装后,我可以第一次执行 REPL 命令而不会出现错误。因此,您的回答似乎解决了我的问题的“我该如何解决”部分,并且是“出了什么问题”部分的起点。赞成。将进行更多测试(在 PATH 中使用和不使用 g++-5 运行 strace)。最后获得赏金的好机会。
  • 比较了在 /usr/local 中安装和不安装自定义 gcc-5 的 strace,唯一 strace 可见的区别是从哪里加载 libstdc++.so.6 和 libgcc_s.so.1,/usr /local/lib 或 /lib。围绕错误点,两个版本都尝试打开文件“/tmp/swift-2.2-SNAPSHOT-2015-12-22-a-ubuntu14.04/usr/lib/swift/linux/x86_64/SwiftShims.swiftmodule”,失败,然后打开“/tmp/swift-2.2-SNAPSHOT-2015-12-22-a-ubuntu14.04/usr/lib/swift/shims/module.map”并成功,从中读取并关闭它。这里唯一 strace 可见的区别是 gcc-5 版本打印错误并退出。
  • 总结一下,Linux 上的 swift 是脆弱的,但没关系,因为它很新。为了减少像我这样想尝试它的人的头疼,swift-for-linux 先决条件应该建议不要在用于运行 swift 的系统上安装 gcc、g++、libgcc、libstdc++ 的非标准安装。
  • 谢谢!是的,如果它对您有帮助,我将触发它的特定包从上游隔离为 libstdc++6。除此之外,我不确定该问题是否应该在 swift 或 libstdc++ 中解决。
【解决方案2】:

这不是一个真正的答案——我和 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 *
}

https://github.com/apple/swift/blob/8d9ef80304d7b36e13619ea50e6e76f3ec9221ba/stdlib/public/SwiftShims/module.map

【讨论】:

  • 感谢您的意见。到目前为止,我对 swift 一无所知。我不知道模块是什么以及它与抱怨丢失文件或目录的错误消息有何关系
  • 我终于通过不安装在/usr/local 中解决了这个问题。我不确定你的设置是什么样的,但我确定它与我的不同。
  • 不在 /usr/local,而是在哪里?至于我的设置,正如问题中详述的那样,第一个 shell 命令是 cd /tmp
  • 谢谢,同时我也发现了邮件列表线程。已经在 $HOME 下设置了 Swift。它没有帮助:错误消息仍然相同。
【解决方案3】:

我在全新的 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,但是在第一次安装 Clang 之前,REPL swift 仍然像原来一样工作。然后我安装了 Clang-3.4,swift build 又开始营业了。

2016 年 1 月 3 日更新:

使用各种 cmet 关于这个问题的提示,我已经能够在我的 Ubuntu 14.04 Azure VM 上重现该错误。作为替代解决方案,该问题也可以通过操纵$LD_LIBRARY_PATH 来解决,参见Unable to compile "hello world" program with Swift on Ubuntu 14.04

【讨论】:

  • 我下载的md5是一样的。感谢您的意见。
【解决方案4】:

有同样的问题,我错过的是我没有得到包的密钥并在提取之前验证它。

  1. 下载包
  2. wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import
  3. gpg --keyserver hkp://pool.sks-keyservers.net --refresh-keys Swift
  4. gpg --verify swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz.sig
  5. tar xzf swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
  6. PATH=/path/to/usr/bin:"${PATH}" 添加到您的.bashrc
  7. 终于运行swift

你应该看到:

Welcome to Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c). Type :help for assistance.
1> 1+1
$R0: Int = 2

【讨论】:

  • 我没有对密钥做任何事情,仍然没有得到错误。知道密钥验证是否适用于 OP 会很有趣。
  • @orkoden 您的编辑赋予了答案与原始答案不同的含义。您的新版本建议应检查下载的完整性。最初的答案表明下载应该在它可以工作之前进行签名。
  • 原评论说下载要签名。但是以下命令从不签署任何内容。 gpg --verify 检查现有签名。
  • @orkoden 查看我对 OmniProg 回复的评论,我已经检查了下载的完整性。 MD5 冲突不太可能导致下载错误通过此检查但未通过 GPG 签名测试。这种损坏将强烈暗示针对编程语言爱好者的非常足智多谋的攻击者。同样,非常不可能。我还是要检查 GPG 签名。
  • @orkoden 是的,最初的答案并不连贯,在散文中它谈到了签名,而在代码中它所做的是检查。我对此的看法是,osleonard 确实有这样的印象,即他需要签署一些东西才能使其发挥作用,误解了他实际上在做什么。这有一种强烈的巫毒教氛围。也许我应该在电脑周围跳三下,看看 swift 是否开始起作用。我仍然不知道我的错误信息是关于什么的,希望能理解 swift 的人解释一下。
【解决方案5】:

听从 James D 的建议,我尝试跑步

sudo apt-get install ppa-purge
sudo ppa-purge -d trusty ppa:ubuntu-toolchain-r/test

但是,这不起作用。奇怪的是,did 工作没有意义。对我来说,我通过安装上面的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-10
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多