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

时间:2012-05-31 17:35:56

标签: build compilation go

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

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

set GOPATH=%cd%
go build main.go

但这也行不通。

感谢任何帮助。

7 个答案:

答案 0 :(得分:74)

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

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

myproject/go/src/myprog/xxx.go

然后将myproject/go添加到GOPATH

然后运行

go install myprog

这样你就可以在myproject / go / src中添加其他软件包和程序。

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

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

答案 1 :(得分:58)

当您将代码从main.go分隔为例如more.go时,您只需将该文件传递给go build / go run / go install

所以如果你以前跑了

go build main.go

你现在只是

go build main.go more.go

进一步的信息:

go build --help

规定:

If the arguments are a list of .go files, build treats them as a list
of source files specifying a single package.

请注意,go buildgo installgo run的不同之处在于,前两个状态指望包名称作为参数,而后者需要去文件。但是,前两个也将接受go文件,就像go install一样。

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

答案 2 :(得分:26)

您也可以运行

go build

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

然后你可以输入

./myprog

运行您的应用

答案 3 :(得分:21)

由于使用Go 1.11+,因此不再建议使用GOPATH,因此新方法是使用Go模块。

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

  1. 创建目录:

    mkdir simple
    cd simple
    
  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.
    
  3. 将所有文件放在该目录中。

  4. 最后,运行:

    go run .
    
  5. 或者,您可以通过构建可执行程序来创建可执行程序:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

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

Go从1.11开始就提供了对版本模块的支持。最初的原型vgo于2018年2月发布。2018年7月,版本化模块降落在主Go存储库中。 在Go 1.14中,模块支持被认为已准备好用于生产,并且鼓励所有用户从其他依赖项管理系统迁移到模块。

答案 4 :(得分:3)

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

go build ./... -o ./myproject

然后运行./myproject

假设您的项目结构如下

- hello
|- main.go

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

go build -o ./myproject

然后在外壳上运行./myproject

# most easiest; builds and run simultaneously
go run main.go

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

- hello
|- cmd
 |- main.go

然后您将运行

go run cmd/main.go

答案 5 :(得分:1)

您可以使用

if (Object.prototype.propertyIsEnumerable.call(this_obj, 'string')) {
  result.push(this_obj.string);
}

两者都可以使用,您也可以使用

go build *.go 
go run *.go

答案 6 :(得分:0)

是的!这很简单,这就是打包策略起作用的地方。据我所知,有三种方法。 文件夹结构:

GOPATH / src /           github.com/           abc /           我的项目/                 适配器/                     main.go                     pkg1                     pkg2 警告:适配器只能包含软件包main和sun目录

  1. 导航到“ adapter”文件夹。运行:
class B(object):
   def __init__(self, a = None):
       if not a:
           a = A()
       self.a = a
  1. 导航到“ adapter”文件夹。运行:
    go build main.go
  1. 导航到GOPATH / src 识别到包main的相对路径,这里是“ myproject / adapter”。运行:
    go build main.go

exe文件将在您当前所在的目录中创建。