如何编译由多个文件组成的Go程序?

Vit*_*aly 78 compilation build go

所以我有一个由三个文件组成的小程序,都属于同一个包(main),但是当我"go build main.go"时,构建不成功.当它只是一个文件(main.go)时一切正常.现在我花了一些力气来分离代码,看起来编译器无法找到从main.go中取出的东西并放入这两个其他文件(与main.go位于同一目录) .这导致"未定义'类型'"错误.

我读了一些关于设置GOPATH变量的内容,所以我试过了

set GOPATH=%cd%
go build main.go
Run Code Online (Sandbox Code Playgroud)

但那也行不通.

任何帮助表示赞赏.

Den*_*ret 82

假设您正在编写一个名为myprog的程序:

将所有文件放在这样的目录中

myproject/go/src/myprog/xxx.go
Run Code Online (Sandbox Code Playgroud)

然后添加myproject/go到GOPATH

并运行

go install myprog
Run Code Online (Sandbox Code Playgroud)

这样,如果需要,您将能够在myproject/go/src中添加其他包和程序.

参考:http://golang.org/doc/code.html

(这个文档总是被新手错过,并且一开始常常不明白.它应该得到Go团队IMO的最大关注)

  • 为什么不摆脱/ go /而只做myproject / src? (2认同)
  • @DenysSéguret 不确定我是否同意这一点,但无论如何这是针对简单项目的,您可以放弃 go 部分-人们可能认为 go 是必要的,而事实并非如此。你告诉我,哪个更简单,去还是不去?:) (2认同)

Kis*_*aki 64

当您从代码分离main.go成例如more.go,您只需传递文件go build/ go run/ go install为好.

所以,如果你以前跑过

go build main.go
Run Code Online (Sandbox Code Playgroud)

你现在简单

go build main.go more.go
Run Code Online (Sandbox Code Playgroud)

作为进一步信息:

go build --help
Run Code Online (Sandbox Code Playgroud)

状态:

If the arguments are a list of .go files, build treats them as a list
of source files specifying a single package.
Run Code Online (Sandbox Code Playgroud)

请注意,go buildgo install从不同go run的是,前两个国家的期望包名作为参数,而后者则希望去文件.但是,前两个也会像go install一样接受go文件.

如果您想知道:build将只build包装/文件,install将在您的GOPATH中生成对象和二进制文件,run并将编译并运行您的程序.

  • 如果您不想继续添加越来越多的文件,请使用正则表达式:go run*.go (5认同)
  • go build*.go,那有用吗?不适合我 (2认同)

poo*_*lla 28

你也可以跑

go build
Run Code Online (Sandbox Code Playgroud)

在项目文件夹myproject/go/src/myprog中

然后你可以输入

./myprog
Run Code Online (Sandbox Code Playgroud)

运行你的应用程序

  • 输出是go对象,而不是可执行文件. (3认同)

Ina*_*mus 28

从 Go 1.11+ 开始,不再推荐使用 GOPATH,新的方式是使用 Go Modules。

假设您正在编写一个名为 的程序simple

  1. 创建目录:

    mkdir simple
    cd simple
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个新模块:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将所有文件放在该目录中。

  4. 最后,运行:

    go run .
    
    Run Code Online (Sandbox Code Playgroud)
  5. 或者,您可以通过构建它来创建一个可执行程序:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    
    Run Code Online (Sandbox Code Playgroud)

有关更多信息,您可以阅读

从 1.11 开始,Go 已经包含了对版本模块的支持,正如这里提出的那样。最初的原型 vgo 于 2018 年 2 月发布。 2018 年 7 月,版本化模块登陆 Go 主存储库。在 Go 1.14 中,模块支持被认为可以用于生产,并鼓励所有用户从其他依赖管理系统迁移到模块。

  • 我不是在编写一个简单的程序,可以说我有一个包含多个包的大项目。我如何为此创建一个可执行文件?我必须转到每个包并运行 go build 吗? (4认同)

ala*_*min 8

这取决于您的项目结构。但最直接的是:

go build -o ./myproject ./...
Run Code Online (Sandbox Code Playgroud)

然后运行./myproject

假设你的项目结构是这样的

- hello
|- main.go
Run Code Online (Sandbox Code Playgroud)

然后你只需转到项目目录并运行

go build -o ./myproject
Run Code Online (Sandbox Code Playgroud)

然后./myproject在shell上运行。

或者

# most easiest; builds and run simultaneously
go run main.go
Run Code Online (Sandbox Code Playgroud)

假设您的主文件嵌套在子目录中,例如 cmd

- hello
|- cmd
 |- main.go
Run Code Online (Sandbox Code Playgroud)

然后你会跑

go run cmd/main.go
Run Code Online (Sandbox Code Playgroud)


Tus*_*aha 5

您可以使用

go build *.go 
go run *.go
Run Code Online (Sandbox Code Playgroud)

两者都可以使用

go build .
go run .
Run Code Online (Sandbox Code Playgroud)