使用ldflags为二进制文件提供一个在golang中不工作的版本

sbdsn5lh  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(106)

主.如下所示:

package main

func main() {
    println("hello world")
}

Makefile文件为:

flags=-X main.version=1.5.0

build:
    go build -ldflags "$(flags)" -o main main.go

然后我运行make,得到主文件。
运行./main -v后,我得到:

hello world

为什么不显示1.5.0
go版本是go version go1.18 darwin/arm64,当我运行go version -m main时,我得到:

main: go1.18
        path    command-line-arguments
        build   -compiler=gc
        build   -ldflags="-X main.version=1.5.0"
        build   CGO_ENABLED=1
        build   CGO_CFLAGS=
        build   CGO_CPPFLAGS=
        build   CGO_CXXFLAGS=
        build   CGO_LDFLAGS=
        build   GOARCH=arm64
        build   GOOS=darwin

我对ldflags有一个误解。它的工作原理如下:
第一个

wnvonmuf

wnvonmuf1#

你用ldflags(version)设置的变量必须在包级别声明。你必须自己实现对-v的处理。
第一个

68bkxrlz

68bkxrlz2#

如果构建了一个包(如go build github.com/xxx/yyy/zzz),则必须相应地添加符号前缀。例如:

go build \
    -ldflags "-X github.com/xxx/yyy/zzz/main.version=1.5.0" \
    -o my-awesome-app \
    github.com/xxx/yyy/zzz

B.T.W.另一种确定使用哪个符号ID的方法是为要查找的变量运行nm和grep。

相关问题