Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengabaikan gotvm apabila membina binari ARM64

Bagaimana untuk mengabaikan gotvm apabila membina binari ARM64

PHPz
PHPzke hadapan
2024-02-05 21:27:07454semak imbas

如何在构建 ARM64 二进制文件时忽略gotvm

Kandungan soalan

Saya ingin membina repositori go saya untuk membina repositori lengkap dalam goarch=arm64 时忽略 myrepo/gotvm/* dan dalam sebarang kes lain.

Struktur folder projek adalah seperti berikut:

└── myrepo
    ├── go.mod
    ├── main.go
    ├── gotvm
    │   ├── array.go
    │   ├── device.go
    │   └── gotvm.go
    └── otherstuff
        └── otherstuff.go

Semuanya berfungsi dengan baik apabila membina pada amd64:

goos=linux goarch=amd64 go build -o amdbuild main.go

Dibina berdasarkan arm64

goos=linux goarch=arm64 go build -o armbuild main.go

Ralat berikut berlaku sebelum binari tidak dicipta:

package command-line-arguments
    imports github.com/myrepo/gotvm: build constraints exclude all go files in /homedir/myrepo/gotvm

Begitu juga apabila saya menambah baris berikut pada bahagian atas setiap fail menggunakan package gotvm (array.go, device.go, gotvm.go):

//go:build amd64
// +build amd64`

Langkah lain yang saya cuba:

  • go clean -modcache
  • Tambahkan bendera binaan berikut package gotvm di atas semua fail kepunyaan
  • (secara individu)
// go:build (darwin && cgo) || (linux && cgo)
//go:build amd64
// +build amd64`

Ada soalan yang sama di sini: (pakej simulasi) , tetapi ini mengabaikan keseluruhan folder. Saya mahu mengabaikan folder dengan arch 不是 arm64 sebagai syarat.

tl;dr; Adakah terdapat cara untuk menyusun semula repositori saya ke arm64 dan amd64? Saya mahu mengabaikan tvm dalam binaan arm64.

Spesifikasi:

  • versi pergi: go1.20.4 linux/amd64
  • Sistem: ubuntu 20.04.5 lts

Jawapan betul


Tambahkan fail go yang mengandungi hanya klausa pakej pada fail gotvm 文件夹中可以解决此问题。例如,doc.go:

// this file is a workaround for the following issue when built with goarch=arm64:
//
//   build constraints exclude all go files in /homedir/myrepo/gotvm

package gotvm

Tetapi apabila anda menghadapi masalah ini, kebanyakan masa, ini bermakna terdapat sekurang-kurangnya satu fail yang mengimport pakej ini, dan goarch=arm64不排除这个文件。也许您应该从此文件中删除导入(或者对于 goarch=arm64 kecualikan fail ini juga).

Saya akan menambah demo untuk menggambarkan masalah. Ini adalah fail:

├── go.mod
├── gotvm
│   └── gotvm.go
└── main.go

go.mod:

module example.com/m

go 1.20

gotvm/gotvm.go:

//go:build amd64

package gotvm

import "fmt"

func f() {
    fmt.println("do awesome things using amd64")
}

main.go:

package main

import (
    "fmt"

    _ "example.com/m/gotvm"
)

func main() {
    fmt.Println("Hello world!")
}

Untuk demo ini, mulakan dengan main.go 中删除 _ "example.com/m/gotvm" 或添加前面提到的 doc.go 文件即可解决该问题。我认为,最好从 main.go 中删除 _ "example.com/m/gotvm" .

Atas ialah kandungan terperinci Bagaimana untuk mengabaikan gotvm apabila membina binari ARM64. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam