GoReleaser交叉编译失败



我试图在linuxwindwos机器上发布我的项目,但没有成功。

我曾尝试将-CC明确定义为几个选项,但它们都不适用于这两台机器。

预装软件包:

sudo apt-get-install build必不可少sudo apt-get安装gcc multilib g++-multlibsudo apt-get安装gcc-ming-w64

在这个项目中,我使用的是c代码,它使用这些flags来选择性编译

//#cgo windows CFLAGS: "-IC:/Program Files/OpenSSL-Win64/include"
//#cgo windows LDFLAGS: "-LC:/Program Files/OpenSSL-Win64/lib" -llibcrypto
//#cgo linux LDFLAGS: -lssl -lcrypto
//#cgo CFLAGS: -Wno-deprecated-declarations

windows计算机上本地运行GoRelaser将导致此错误。

⨯ release failed after 24.28s error=failed to build for windows_arm64: exit status 2: # runtime/cgo
gcc_arm64.S: Assembler messages:
gcc_arm64.S:28: Error: no such instruction: `stp x29,x30,[sp,'
gcc_arm64.S:32: Error: too many memory references for `mov'
gcc_arm64.S:34: Error: no such instruction: `stp x19,x20,[sp,'
gcc_arm64.S:37: Error: no such instruction: `stp x21,x22,[sp,'
gcc_arm64.S:40: Error: no such instruction: `stp x23,x24,[sp,'
gcc_arm64.S:43: Error: no such instruction: `stp x25,x26,[sp,'
gcc_arm64.S:46: Error: no such instruction: `stp x27,x28,[sp,'
gcc_arm64.S:50: Error: too many memory references for `mov'
gcc_arm64.S:51: Error: too many memory references for `mov'
gcc_arm64.S:52: Error: too many memory references for `mov'
gcc_arm64.S:54: Error: no such instruction: `blr x20'
gcc_arm64.S:55: Error: no such instruction: `blr x19'
gcc_arm64.S:57: Error: no such instruction: `ldp x27,x28,[sp,'
gcc_arm64.S:60: Error: no such instruction: `ldp x25,x26,[sp,'
gcc_arm64.S:63: Error: no such instruction: `ldp x23,x24,[sp,'
gcc_arm64.S:66: Error: no such instruction: `ldp x21,x22,[sp,'
gcc_arm64.S:69: Error: no such instruction: `ldp x19,x20,[sp,'
gcc_arm64.S:72: Error: no such instruction: `ldp x29,x30,[sp],'
⨯ release failed after 24.28s error=failed to build for windows_arm64: exit status 2: # runtime/cgo
gcc_arm64.S: Assembler messages:
gcc_arm64.S:28: Error: no such instruction: `stp x29,x30,[sp,'
gcc_arm64.S:32: Error: too many memory references for `mov'
gcc_arm64.S:34: Error: no such instruction: `stp x19,x20,[sp,'
gcc_arm64.S:37: Error: no such instruction: `stp x21,x22,[sp,'
gcc_arm64.S:40: Error: no such instruction: `stp x23,x24,[sp,'
gcc_arm64.S:43: Error: no such instruction: `stp x25,x26,[sp,'
gcc_arm64.S:46: Error: no such instruction: `stp x27,x28,[sp,'
gcc_arm64.S:50: Error: too many memory references for `mov'
gcc_arm64.S:51: Error: too many memory references for `mov'
gcc_arm64.S:52: Error: too many memory references for `mov'
gcc_arm64.S:54: Error: no such instruction: `blr x20'
gcc_arm64.S:55: Error: no such instruction: `blr x19'
gcc_arm64.S:57: Error: no such instruction: `ldp x27,x28,[sp,'
gcc_arm64.S:60: Error: no such instruction: `ldp x25,x26,[sp,'
gcc_arm64.S:63: Error: no such instruction: `ldp x23,x24,[sp,'
gcc_arm64.S:66: Error: no such instruction: `ldp x21,x22,[sp,'
gcc_arm64.S:69: Error: no such instruction: `ldp x19,x20,[sp,'
gcc_arm64.S:72: Error: no such instruction: `ldp x29,x30,[sp],'

ubuntu机器上本地运行GoReleaser将导致

gcc: error: unrecognized command line option ‘-mthreads’; did you mean ‘-pthread’?

GoReleaser:

# This is an example .goreleaser.yml file with some sensible defaults.
# Make sure to check the documentation at https://goreleaser.com
before:
hooks:
# You may remove this if you don't use go modules.
- go mod tidy
# you may remove this if you don't need go generate
- go generate ./...
builds:
- env:
- CGO_ENABLED=1
goos:
- linux
- windows
archives:
- replacements:
linux: Linux
windows: Windows
386: i386
amd64: x86_64
checksum:
name_template: 'checksums.txt'
snapshot:
name_template: "{{ incpatch .Version }}-next"
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'

默认情况下,GoReleaser将尝试为386、amd64和arm64进行构建。但是你的windows机器就像amd64/x86_64机器。通常情况下,这对Go来说没有问题,但由于您使用CGO,您的C工具链必须支持arm64的编译,而事实并非如此。

您应该能够通过将goarch添加到您的配置文件中来限制它试图构建的CPU体系结构:

...
builds:
goarch:
- amd64
...

交叉编译cgo项目是出了名的困难,也是GoReleaser的一个已知限制。如果你还没有看过cgo食谱,我建议你看看。

至于你在ubuntu上遇到的错误,看起来你的C工具链没有正确的依赖项/功能来交叉编译到windows。

我自己没有做过任何CGO交叉编译(试图不惜一切代价避免它(,所以我不能保证这个工具,但从我在网上读到的内容来看,xgo可能会帮助你。

最新更新