C語言中文網 目錄

go build命令(go語言編譯命令)完全攻略

< 上一頁Go語言編譯與工具 go run命令下一頁 >

Go 語言的編譯速度非常快。Go 1.9 版本后默認利用 Go 語言的并發特性進行函數粒度的并發編譯。

Go 語言的程序編寫基本以源碼方式,無論是自己的代碼還是第三方代碼,并且以 GOPATH 作為工作目錄和一套完整的工程目錄規則。因此 Go 語言中日常編譯時無須像 C++ 一樣配置各種包含路徑、鏈接庫地址等。

Go 語言中使用 go build 命令將源碼編譯為可執行文件。go build 有很多種編譯方法,如無參數編譯、文件列表編譯、指定包編譯等,使用這些方法都可以輸出可執行文件。

go build 無參數編譯

本小節需要用到的代碼具體位置是./src/chapter11/gobuild
本套教程所有源碼下載地址:https://pan.baidu.com/s/1ORFVTOLEYYqDhRzeq0zIiQ    提取密碼:hfyf
代碼相對于 GOPATH 的目錄關系如下:

.
└── src
    └── chapter11
        └── gobuild
            ├── lib.go
            └── main.go


main.go 代碼如下:
package main

import (
    "fmt"
)

func main() {

    // 同包的函數
    pkgFunc()

    fmt.Println("hello world")
}

lib.go 代碼如下:
package main

import "fmt"

func pkgFunc() {
    fmt.Println("call pkgFunc")
}
如果源碼中沒有依賴 GOPATH 的包引用,那么這些源碼可以使用無參數 go build。格式如下:

go build

在代碼所在目錄(./src/chapter11/gobuild)下使用go build 命令,如下所示:

$ cd src/chapter11/gobuild/
$ go build
$ ls
gobuild  lib.go  main.go
$ ./gobuild
call pkgFunc
hello world

命令行指令和輸出說明如下:
  • 第 1 行,轉到本例源碼目錄下。
  • 第 2 行,go build 在編譯開始時,會搜索當前目錄的 go 源碼。這個例子中,go build 會找到 lib.go 和 main.go 兩個文件。編譯這兩個文件后,生成當前目錄名的可執行文件并放置于當前目錄下,這里的可執行文件是 gobuild。
  • 第 3 行和第 4 行,列出當前目錄的文件,編譯成功,輸出 gobuild 可執行文件。
  • 第 5 行,運行當前目錄的可執行文件 gobuild。
  • 第 6 行和第 7 行,執行 gobuild 后的輸出內容。

go build+文件列表

編譯同目錄的多個源碼文件時,可以在 go build 的后面提供多個文件名,go build 會編譯這些源碼,輸出可執行文件,“go build+文件列表”的格式如下:

go build file1.go file2.go……

在代碼代碼所在目錄(./src/chapter11/gobuild)中使用 go build,在 go build 后添加要編譯的源碼文件名,代碼如下:

$ go build main.go lib.go
$ ls
lib.go  main  main.go
$ ./main
call pkgFunc
hello world
$ go build lib.go main.go
$ ls
lib  lib.go  main  main.go

命令行指令和輸出說明如下:
  • 第 1 行在 go build 后添加文件列表,選中需要編譯的 Go 源碼。
  • 第 2  行和第 3 行列出完成編譯后的當前目錄的文件。這次的可執行文件名變成了 main。
  • 第 4~6 行,執行 main 文件,得到期望輸出。
  • 第 7 行,嘗試調整文件列表的順序,將 lib.go 放在列表的首位。
  • 第 8 行和第 9 行,編譯結果中出現了 lib 可執行文件。

提示

使用“go build+文件列表”方式編譯時,可執行文件默認選擇文件列表中第一個源碼文件作為可執行文件名輸出。

如果需要指定輸出可執行文件名,可以使用-o參數,參見下面的例子:

$ go build -o myexec main.go lib.go
$ ls
lib.go  main.go  myexec
$ ./myexec
call pkgFunc
hello world

上面代碼中,在 go build 和文件列表之間插入了-o myexec參數,表示指定輸出文件名為 myexec。

注意

使用“go build+文件列表”編譯方式編譯時,文件列表中的每個文件必須是同一個包的 Go 源碼。也就是說,不能像 C++ 語言一樣,將所有工程的 Go 源碼使用文件列表方式進行編譯。編譯復雜工程時需要用“指定包編譯”的方式。

“go build+文件列表”方式更適合使用 Go 語言編寫的只有少量文件的工具。

go build+包

“go build+包”在設置 GOPATH 后,可以直接根據包名進行編譯,即便包內文件被增(加)刪(除)也不影響編譯指令。

1) 代碼位置及源碼

本小節需要用到的代碼具體位置是./src/chapter11/goinstall
本套教程所有源碼下載地址:https://pan.baidu.com/s/1ORFVTOLEYYqDhRzeq0zIiQ    提取密碼:hfyf
相對于GOPATH的目錄關系如下:

.
└── src
    └── chapter11
        └──goinstall
            ├── main.go
            └── mypkg
                └── mypkg.go

main.go代碼如下:
package main

import (
    "chapter11/goinstall/mypkg"
    "fmt"
)

func main() {

    mypkg.CustomPkgFunc()

    fmt.Println("hello world")
}
mypkg.go代碼如下:
package mypkg

import "fmt"

func CustomPkgFunc() {
    fmt.Println("call CustomPkgFunc")
}

2) 按包編譯命令

執行以下命令將按包方式編譯 goinstall 代碼:

$ export GOPATH=/home/davy/golangbook/code
$ go build -o main chapter11/goinstall
$ ./goinstall
call CustomPkgFunc
hello world

代碼說明如下:
  • 第 1 行,設置環境變量 GOPATH,這里的路徑是筆者的目錄,可以根據實際目錄來設置 GOPATH。
  • 第 2 行,-o執行指定輸出文件為 main,后面接要編譯的包名。包名是相對于 GOPATH 下的 src 目錄開始的。
  • 第 3~5 行,編譯成功,執行 main 后獲得期望的輸出。

讀者在參考這個例子編譯代碼時,需要將 GOPATH 更換為自己的目錄。注意 GOPATH 下的目錄結構,源碼必須放在 GOPATH 下的 src 目錄下。所有目錄中不要包含中文。

go build編譯時的附加參數

go build 還有一些附加參數,可以顯示更多的編譯信息和更多的操作,詳見下表所示。

go build編譯時的附加參數
附加參數 備  注
-v 編譯時顯示包名
-p n 開啟并發編譯,默認情況下該值為 CPU 邏輯核數
-a 強制重新構建
-n 打印編譯時會用到的所有命令,但不真正執行
-x 打印編譯時會用到的所有命令
-race 開啟競態檢測

表中的附加參數按使用頻率排列,讀者可以根據需要選擇使用。
< 上一頁Go語言編譯與工具 go run命令下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo