Golang在Linux上编译成功但在Windows上失败的原因

Golang在Linux上编译成功但在Windows上失败的原因 嘿,我又来了 😕

我正尝试在 Windows 上构建一个项目(go build go-client.go LogStorage.go),这个项目在 Linux 上构建是成功的。使用完全相同的文件,在 Windows 上却无法工作,并出现如下错误:

image

我想知道是否有人曾经遇到过同样的问题?有人知道如何解决吗?LogStorage.go 文件是从 Solidity 生成的智能合约(使用 solc 和 abigen)。

非常感谢!此致,

Foocil


更多关于Golang在Linux上编译成功但在Windows上失败的原因的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

很高兴你解决了这个问题。

更多关于Golang在Linux上编译成功但在Windows上失败的原因的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


太好了!我一有时间就会在GitHub上提交一个工单!

非常感谢你的帮助和宝贵时间。

非常感谢您的回答!

我通过在Windows上手动修复错误(有问题的文件是自动生成的代码)解决了我的问题。所以现在一切正常。

诚挚的问候,

原因是 Go 是一门编译型语言。这意味着你不能将使用 go build 命令生成的 Compile.exe 文件,并期望它在其他操作系统上运行。你应该为每个操作系统创建多个编译文件,或者直接运行代码(使用 go run),让 Go 根据当前操作系统编译文件(这会让 Go 执行代码时花费额外的时间,因为它需要先编译)。

我记得好像有一个解决方案,比如使用 UTF-8 编码之类的,但我实在记不清了,抱歉 😞

根据错误信息,最好在他们的版本控制系统(例如GitHub)上提交一个错误问题工单来解决这个问题。请记得阅读他们的贡献指南。

错误日志明确指出是数据类型不匹配,这是源代码层面的问题。

Foocil: 我可以通过在Windows上手动修复错误(有问题的文件是自动生成的代码)来解决我的问题。所以现在没问题了。

这种“猴子补丁”只在你处于探索和开发阶段的开发过程中有效。你发现的这个错误不适合部署到生产环境。因此,向维护者报告问题将是战略性的步骤。

Zeyad_Shapan: 原因是Go是一种编译型语言。这意味着你不能把用go build生成的Compile.exe文件,指望它能在其他操作系统上运行。你应该为每个操作系统创建多个编译文件,或者直接运行代码“Go run”,让Go根据当前操作系统编译文件(这会让Go执行代码需要额外的时间,因为它需要先编译)。

我记得好像有一个解决方案,比如编码为utf-8之类的,但我实在记不清了,抱歉。

关于Go的“跨操作系统”部署,你是对的。然而,阻碍它的并不是UTF-8编码。😄

每个操作系统都有自己特定的ABI(抽象二进制接口)。因此,这就是为什么你需要为每个操作系统编译程序的原因。

我之前在AppImage论坛上提出过这个问题(Question: Can We Make A Single AppImage to Work on all CPU? (same OS) - #3 by holloway - Creating AppImages - AppImage)。显然,fatELF曾被考虑过,但中途被搁置了。最新的研究是它在理论上是可行的,但在实践中不行,尤其是当你开始考虑其中的商业模式时。

这种情况通常是由于平台特定的文件路径或依赖问题导致的。从错误信息来看,问题出现在 LogStorage.go 文件的第 8 行,该行尝试导入一个本地包 github.com/ethereum/go-ethereum/accounts/abi/bind。在 Windows 上,Go 模块可能无法正确解析这个路径,尤其是在使用大小写敏感的文件系统或 GOPATH 配置不一致时。

首先,检查你的 go.mod 文件,确保模块路径和依赖项正确。然后,尝试清理模块缓存并重新下载依赖:

go clean -modcache
go mod tidy

如果问题仍然存在,可能是由于 Windows 上的路径大小写问题。Go 在导入路径中是大小写敏感的,但 Windows 文件系统默认不区分大小写。确保你的项目目录结构和导入语句中的大小写完全匹配。例如,如果实际路径是 github.com/ethereum/go-ethereum,但导入时写成了 github.com/Ethereum/go-ethereum,在 Linux 上可能可以工作,但在 Windows 上会失败。

另外,检查 LogStorage.go 文件第 8 行的导入语句,确保没有拼写错误。如果是从 Solidity 生成的代码,可能需要重新生成并确保生成工具在 Windows 上正确运行。例如,使用 abigen 时,指定正确的输出路径:

abigen --sol=LogStorage.sol --pkg=main --out=LogStorage.go

如果依赖项是本地修改的,确保在 Windows 上也有相同的版本。你可以尝试将依赖项替换为官方版本,或者使用 replace 指令在 go.mod 中重定向:

module your-module-name

go 1.21

replace github.com/ethereum/go-ethereum => /path/to/local/go-ethereum

最后,运行构建命令时,添加 -v 标志以获取详细输出,帮助诊断问题:

go build -v go-client.go LogStorage.go

如果以上步骤都不起作用,请提供更多错误详情或项目结构,以便进一步分析。

回到顶部