Golang中cmd/compile不允许使用internal包的解决方法

Golang中cmd/compile不允许使用internal包的解决方法 当我运行 go run src/cmd/compile/main.go 时,在 main.go:8:2 处遇到错误:不允许使用内部包 cmd/compile/internal/amd64。我对这个错误感到困惑,无法解决。

    when I run `go run src/cmd/compile/main.go`, I got error at main.go:8:2: use of internal package cmd/compile/internal/amd64 not allowed. I'm confused with the error and cann't solve it.

更多关于Golang中cmd/compile不允许使用internal包的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你运行的是哪个版本的 Go?如果我导航到我的 go 文件夹(在我的情况下是 /usr/local/go),当我输入 go run src/cmd/compile/main.go 时,我得到了 go 工具编译的帮助输出。

$ go version
go version go1.19 linux/386

更多关于Golang中cmd/compile不允许使用internal包的解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个错误是因为Go语言对internal目录有严格的访问限制。根据Go的设计,internal包只能被其父目录及其子目录中的代码导入,不能从外部导入。

在您的情况下,cmd/compile/main.go试图导入cmd/compile/internal/amd64,但由于main.go位于cmd/compile目录下,而internal目录也在cmd/compile下,这应该被允许。问题可能是您没有使用正确的构建方式。

正确的做法是使用Go工具链来构建编译器,而不是直接运行main.go。以下是几种解决方案:

方案1:使用go install构建编译器

# 进入Go源码目录
cd /path/to/go/src

# 构建编译器
go install cmd/compile

方案2:使用make.bash(完整构建)

# 在Go源码根目录执行
cd /path/to/go/src
./make.bash
# 或者
./all.bash

方案3:如果确实需要直接运行,设置正确的GOPATH

# 设置GOPATH为Go源码的父目录
export GOPATH=/path/to/go

# 然后运行
go run cmd/compile/main.go

示例:查看编译器内部包的正常使用方式

在Go源码中,cmd/compile/internal包的正确使用示例如下:

// 在 cmd/compile/internal/gc/main.go 中可以看到正确的导入方式
package main

import (
    "cmd/compile/internal/amd64"  // 这是允许的,因为都在internal目录下
    "cmd/compile/internal/ssa"
    "cmd/compile/internal/types"
)

func main() {
    // 编译器代码
}

重要说明:

  1. Go的编译器是自举的,需要特殊的构建流程
  2. 直接运行cmd/compile/main.go通常不是正确的做法
  3. 如果您想修改编译器代码并测试,应该使用完整的构建流程

如果您只是想测试编译器的某个功能,建议使用方案1或方案2。如果您在开发或修改编译器代码,构建后可以通过go tool compile命令来使用新编译器。

回到顶部