Ошибка кросс-компиляции 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 может вам помочь.

Другие вопросы по тегам