gpt4 book ai didi

go - Stringer 工具提示错误的存档 header

转载 作者:IT王子 更新时间:2023-10-29 00:45:24 28 4
gpt4 key购买 nike

我正在尝试使用 go generate/stringer (golang.org/x/tools/cmd/stringer) 在枚举上生成 String() 方法。我有问题,我认为是因为不同系统上的 .a 包格式略有不同。我有这个文件:

package main

import (
"math/rand"
)

//go:generate stringer -type=Foo
type Foo int;

const (
FooPrime Foo = iota
FooBis
)

func main() {
//Just use rand anywhere, otherwise we get a compiler error
rand.Seed(1)
}

现在,如果我在我的机器上运行 go generate example.go 一切正常:foo_string.go 已创建。但是,在测试机上我得到:

stringer: checking package: example.go:4:2: could not import math/rand (reading export data: /usr/lib64/go/pkg/linux_amd64/math/rand.a: go archive is missing __.PKGDEF)

现在,在深入研究代码后,我认为我得到了这个错误,因为在我的机器上 rand.a 有以下 header :

!<arch>
__.PKGDEF 0 0 0 644 2051

`在测试机上它有以下标题:

!<arch>
__.PKGDEF/ 0 399 399 100644 2051

`

我认为关键的区别在于 PKGDEFF 之后的斜杠。 gcimporter 拒绝处理 .a 文件,如果它没有 __.PKGDEF header 。

为了检查这一点,我手动编辑了 gcimporter/exportdata.go 并更改了其中一行:

if name != "__.PKGDEF"

为此:

if name != "__.PKGDEF" && name != "__.PKGDEF\"

进行此更改(并编译和安装所有内容)后,我能够在 example.go 上运行 go generate。

我的问题是:为什么我会遇到这个问题以及如何摆脱它(除了手动编辑外部库)?

最佳答案

我从 openSUSE 的打包规范中可以看出,他们禁止在更新时重新安装标准库。 __.PKGDEF 是 Go 特定的信息部分,OpenSUSE 使用的一些链接器只是产生了不兼容的输出。

除了从官方来源安装健康的 Go 之外,您无能为力。

关于go - Stringer 工具提示错误的存档 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29800079/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com