猿问

使用 -X ldflag 调试问题

我有一个这样的程序:


package main


import "fmt"


var version string


func main() {

    fmt.Printf("Version %s\n", version)

}

我想在编译时更改版本的值,如此处所示,所以我以这种方式构建它(wtf.go 在 src/wtf 中):


go build -ldflags "-X wtf/main.version=1.0.0.1234" wtf

go install wtf

但是当我运行时,版本是一个空字符串。


我尝试了各种版本的外壳,包名称和路径的不同变体。似乎go build并没有太多地验证包/变量名,因为显然伪造的不会产生错误。


有没有办法找出 go 试图修改的变量,以便解决这个问题?


我正在为 Windows/amd64 使用 Go v 1.10.3。


收到一只叮咚
浏览 118回答 1
1回答

慕田峪4524236

错误是你必须通过导入路径指定包,而不是src文件夹的相对文件夹。所以简单地引用你的version变量,比如main.version. 所以导航到%GOPATH%/src/wtf,并使用以下命令构建它:go build -ldflags "-X main.version=1.0.0.1234" wtf.go(或者如果文件夹中没有包含其他包的源文件src/wtf,则可以省略源文件名。)这会将 放置wtf.exe在当前文件夹中。运行它会打印:Version 1.0.0.1234请注意,这go install不是必需的。这将构建您的应用程序并将可执行二进制文件放入%GOPATH%/bin,但不会有设置version!如果要使用go install,则必须再次提供标志。在文件夹中运行以下命令%GOPATH%/src/wtf:go install -ldflags "-X main.version=1.0.0.1234"另请注意,go install不需要您go build先运行,也不需要go install先运行go build。
随时随地看视频慕课网APP

相关分类

Go
我要回答