【问题标题】:How to compile Go program consisting of multiple files?如何编译由多个文件组成的 Go 程序?
【发布时间】:2012-06-05 23:56:40
【问题描述】:

我有一个由三个文件组成的小程序,它们都属于同一个包(main)。但是当我做go build main.go 时,构建没有成功。当它只有一个文件 (main.go) 时,一切正常。

现在我花了一些精力来分离代码,看起来编译器无法找到从 main.go 中取出并放入这两个其他文件(与主文件位于同一目录中)的内容。走)。这会导致 undefined 'type' 错误。

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

【问题讨论】:

    标签: go build compiler-errors


    【解决方案1】:

    新方式(推荐):

    Please take a look at this answer.

    旧方式:

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

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

    myproject/go/src/myprog/xxx.go
    

    然后将myproject/go添加到GOPATH

    然后运行

    go install myprog
    

    这样您就可以根据需要在 myproject/go/src 中添加其他包和程序。

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

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

    【讨论】:

    • 为什么不去掉 /go/ 而只做 myproject/src?
    • 另外,我假设“go install myprog”以某种方式将项目源写入 $GOPATH 位置?那正确吗?如果是这样,最好将这个解释作为答案的一部分
    • @AlexanderMills 只有小型项目才使用一种技术。
    • @DenysSéguret 不确定我是否同意这一点,但无论如何这是针对简单项目的,你可以放弃 go 部分——人们可能认为 go 是必要的,但事实并非如此。你告诉我,去还是不去哪个更简单? :)
    • 我还是不明白为什么是这个文件夹结构?
    【解决方案2】:

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

    所以如果你之前跑过

    go build main.go
    

    你现在很简单

    go build main.go more.go
    

    更多信息:

    go build --help
    

    状态:

    如果参数是 .go 文件的列表, build 将它们视为指定单个包的源文件列表。


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

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

    【讨论】:

    • 如果你不想继续添加越来越多的文件,请使用正则表达式,与:go run *.go
    • 好的,谢谢,Go 总是只写一个可执行文件吗?它不会将可执行文件分开(就像在 Java 中一样)?
    • @AlexanderMills 因为 Windows,我认为,使用 nix。或至少 mingw。
    • 是的,我使用的是 MacOS,但可能是 Bash 版本 3 搞砸了,我应该升级到 Bash 4。
    【解决方案3】:

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

    假设你正在编写一个名为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

    自 1.11 起,Go 已包含对此处提议的版本化模块的支持。最初的原型 vgo 于 2018 年 2 月宣布。2018 年 7 月,版本化模块登陆主 Go 存储库。 在 Go 1.14 中,模块支持被认为已准备好用于生产环境,并鼓励所有用户从其他依赖管理系统迁移到模块。

    【讨论】:

    • 我不是在写一个简单的程序,假设我有一个包含多个包的大项目。如何为此创建可执行文件?我必须去每个包并运行 go build 吗?
    【解决方案4】:

    你也可以直接运行

    go build
    

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

    然后你可以输入

    ./myprog
    

    运行您的应用程序

    【讨论】:

    • 输出是一个 go 对象,而不是一个可执行文件。
    • @user2284570 只需添加chmod +x 允许该文件运行它
    【解决方案5】:

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

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

    然后运行./myproject

    假设您的项目结构如下所示

    - hello
    |- main.go
    

    然后你只需进入项目目录并运行

    go build -o ./myproject
    

    然后在 shell 上运行 ./myproject

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

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

    - hello
    |- cmd
     |- main.go
    

    然后你会跑

    go run cmd/main.go
    

    【讨论】:

      【解决方案6】:

      你可以使用

      go build *.go 
      go run *.go
      

      你也可以使用这两种方法

      go build .
      go run .
      

      【讨论】:

        【解决方案7】:

        是的!这是非常直接的,这就是一揽子策略发挥作用的地方。据我所知,有三种方法。 文件夹结构:

        GOPATH/src/ github.com/ ABC/ 我的项目/ 适配器/ main.go 包1 包2 警告:适配器只能包含包 main 和 sun 目录

        1. 导航到“适配器”文件夹。运行:
            go build main.go
        
        1. 导航到“适配器”文件夹。运行:
            go build main.go
        
        1. 导航到 GOPATH/src 识别包 main 的相对路径,这里是“myproject/adapter”。运行:
            go build myproject/adapter
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-25
          • 1970-01-01
          • 2019-05-23
          • 1970-01-01
          • 1970-01-01
          • 2020-12-24
          相关资源
          最近更新 更多