【问题标题】:Go 1.5+ : Error - imports runtime: C source files not allowed when not using cgo or SWIGGo 1.5+:错误 - 导入运行时:不使用 cgo 或 SWIG 时不允许使用 C 源文件
【发布时间】:2015-11-13 22:01:16
【问题描述】:

我的程序与 go 1.4.2 完美构建。安装 go 1.5 后,出现以下错误。

导入运行时:不使用 cgo 时不允许使用 C 源文件或 SWIG:atomic_amd64x.c defs.c float.c heapdump.c lfstack.c malloc.c mcache.c mcentral.c mem_linux.c mfixalloc.c mgc0.c mheap.c msize.c os_linux.c panic.c parfor.c proc.c runtime.c signal.c signal_amd64x.c signal_unix.c stack.c string.c sys_x86.c vdso_linux_amd64.c

错误与程序无关。即使是“Hello world”程序也会抛出同样的错误。

【问题讨论】:

    标签: c go build compilation


    【解决方案1】:

    删除旧的 1.4.x go 安装,然后安装 go 1.5。

    安装 go 1.5 后我遇到了同样的问题。问题是我在 1.4.2 的同一个地方安装了 go 1.5。 Go 1.5 不再使用 C,如果存在旧的 C 安装文件,它会抛出错误,如图所示。

    如果您希望旧安装也存在,则将 1.5 安装到其他位置并将 GOROOT 设置为该位置。

    希望对你有帮助。

    编辑 1:对于 Linux 用户:

    如果你下载了 go1.5*.tar.gz 那么你是这样做的:

    tar -C /usr/local/ -xvf go1.5.linux-amd64.tar.gz

    你的旧文件夹C文件没有被删除,所以正确的过程是:

    首先:您应该删除旧的 go 文件夹。

    sudo rm -rf /usr/local/go/

    第二:然后运行

    tar -C /usr/local/ -xvf go1.5.x.linux-amd64.tar.gz

    【讨论】:

    • 非常感谢。这也解决了我的问题。我有两次导入“导入运行时”并尝试了所有方法 - 我什至删除了我添加的代码,因为我没想到从 go1.4 升级到 go1.5 会导致这种情况。
    • 你能解释一下吗@deFreitas
    • @MayankPatel 即使按照您的建议运行并安装golang 1.6.2,我仍然收到C source files not allowed when not using cgo or SWIG,错误示例为here。我的 CGO_ENABLED="1" env 已启用并安装 gcc 但根本没有工作
    • 出现此错误的原因可能有很多。确保安装了正确版本(32/64 位)的 gcc。尝试在包中添加一个新文件并在其中导入 C 包。类似于 package p import "C" @deFreitas
    • @MayankPatel 代码 author comment 显然是新的 golang 编译不推荐使用的代码样式
    【解决方案2】:

    我有同样的问题,因为我在我的机器上安装了两个版本的 golang,一个来自官方网站,另一个来自 homebrew。

    而且 GOROOT 与 go 二进制文件不匹配,我只是将 GOROOT 替换为正确的,然后完成。

    export GOROOT=/usr/local/opt/go/libexec # install via brew
    

    【讨论】:

      【解决方案3】:

      如果您使用 brew 将您的 go 升级到 Go 1.5。这是我让它发挥作用的步骤:

      1. 删除 %GOPATH% 中的 pkg 文件夹
      2. 重新加载终端(控制台)会话,确保 Go env 转到 Go 1.5 文件夹。

      顺便说一句:如果你想通过brew switch go 1.4.2从 Go 1.5 切换回 Go 1.4.2,你需要做同样的事情。

      【讨论】:

      • 虽然清除 $GOPATH/pkg 可能会有所帮助(这不是严格要求的,因为 go buildgo install 应该只是将内容识别为陈旧并根据需要重新构建内容)它与OP 的问题是来自 Go1.4 的旧 *.c 源文件留在 $GOROOT/src 中。您永远不应该在之前的安装上安装新版本的 Go,而是安装到新的位置(即首先移动/删除旧安装)。
      • go1.4.2不能用,(因为需要导入encoding/json),在go1.5怎么解决这个问题?
      • 这只是发生在我的 brew 上 - 它确实安装到不同的文件夹,但由于某种原因,go 工具使用旧安装,直到我开始一个新的终端会话。重新加载终端可以解决问题。
      • @dmikalova 是的,这就是我的意思。我只是为此编辑我的答案。重新加载终端(控制台)会话。
      【解决方案4】:

      我在编辑器中遇到了这个问题(sublime text 2)。我在保存时调用 go build,看来我的编辑器指向的是 go 1.4.x 而不是新安装的 1.5。

      • 我通过简单地退出并重新打开我的编辑器解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 2018-10-12
        • 2015-05-27
        • 2018-02-16
        • 2020-04-06
        相关资源
        最近更新 更多