Ошибка кросс-компиляции GoReleaser
Я пытаюсь выпустить свой проект в обоих
linux
а также
windwos
машины безуспешно.
Я попытался явно определить
-CC
было несколько вариантов, но ни один из них не работал на обеих машинах.
Предустановленные пакеты:
sudo apt-get install build-essential sudo apt-get install gcc-Multilibg++- Multilibsudo apt-get install gcc-mingw-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
запускать GoRelaser локально на
windows
машина приведет к этой ошибке.
⨯ 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],'
запуск GoReleaser локально на
ubuntu
машина приведет
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:'
1 ответ
По умолчанию GoReleaser попытается сделать сборки для 386, amd64 и arm64. Но ваша машина с Windows похожа на машину amd64/x86_64. Обычно это не проблема с Go, но поскольку вы используете CGO, ваша цепочка инструментов C должна поддерживать компиляцию для arm64, чего нет.
Вы должны иметь возможность ограничить архитектуры ЦП, которые он пытается построить, добавив
goarch
в ваш конфигурационный файл:
...
builds:
goarch:
- amd64
...
Кросс-компиляция проектов cgo общеизвестно сложна и является известным ограничением GoReleaser. Я рекомендую взглянуть на кулинарную книгу cgo , если вы еще этого не сделали.
Что касается ошибки, которую вы получаете в Ubuntu, похоже, что у вашей цепочки инструментов C нет правильных зависимостей/возможностей для кросс-компиляции в Windows.
Я сам не занимался перекрестной компиляцией CGO (стараюсь избежать этого любой ценой), поэтому я не могу поручиться за этот инструмент, но из того, что я читаю в Интернете , xgo может вам помочь.