猿问

为什么每次重建时我的 go 二进制文件都会发生变化?

为什么go build ./每次重新运行某些项目会产生不同的结果?


例如:


$ cd go/src/github.com/google/cadvisor

$ go build ./

$ sh1sum cadvisor

cdfc3c38898e2decd5df35b661737f7cc4f514ed  cadvisor

$ go build ./

$ sha1sum cadvisor

a94db96d684225e7a45cc68c5341fe6f57897c23  cadvisor

完全隔离设置:


$ go version

go version go1.6.2 linux/amd64

$ export GOPATH=$(mktemp -d)

$ cd $GOPATH

$ go get github.com/tools/godep

$ go get github.com/google/cadvisor

package github.com/influxdb/influxdb/client: code in directory /tmp/tmp.2MxFdNmdDe/src/github.com/influxdb/influxdb/client expects import "github.com/influxdata/influxdb/client"

$ cd src/github.com/google/cadvisor

$ $GOPATH/bin/godep restore

godep: WARNING: Go version (go1.6) & $GO15VENDOREXPERIMENT= wants to enable the vendor experiment, but disabling because a Godep workspace (Godeps/_workspace) exists

$ go build ./

...


慕无忌1623718
浏览 183回答 2
2回答

一只名叫tom的猫

这是因为您使用的是 CGO,Go 创建了一个用于编译 C 代码的 tmp 目录,并且该路径嵌入到二进制文件中。

冉冉说

1-这是示例代码,每次构建时都会自行更改(也因为嵌入__DATE__并且__TIME__每次构建时都会更改):package main/*#include<stdint.h>#include<string.h>void getCompileDateTime(uint8_t&nbsp; dt[12],uint8_t tm[9]){&nbsp; strcpy(dt, __DATE__); //Mmm dd yyyy&nbsp; strcpy(tm, __TIME__);&nbsp; //hh:mm:ss}*/import "C"import (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "unsafe")func main() {&nbsp; &nbsp; dt := make([]byte, 12)&nbsp; &nbsp; tm := make([]byte, 10)&nbsp; &nbsp; C.getCompileDateTime((*C.uint8_t)(unsafe.Pointer(&dt[0])), (*C.uint8_t)(unsafe.Pointer(&tm[0])))&nbsp; &nbsp; dts, tms := string(dt), string(tm)&nbsp; &nbsp; fmt.Println(dts, tms)}2-一旦使用 cgo,二进制文件将在 DWARF 部分中包含 $WORK 路径当前问题:1. cgo 构建中的 $WORK 路径泄漏。2. -cover 和测试中的 $WORK 路径泄漏。参考:https : //github.com/golang/go/issues/92063- 多次构建纯 Go 程序将生成相同的二进制文件。我希望这有帮助。
随时随地看视频慕课网APP

相关分类

Go
我要回答