#go
#Вперед
Вопрос:
Я написал ниже, build.go
чтобы автоматизировать процесс перекрестной компиляции, но это не удается Android
, в чем может быть причина:
package main
import (
"fmt"
"os"
"os/exec"
)
type compiles struct {
sys string
arch string
}
func main() {
var output string
// go tool dist list
systems := []compiles{
compiles{
sys: "darwin",
arch: "amd64",
},
compiles{
sys: "android",
arch: "amd64",
},
compiles{
sys: "linux",
arch: "amd64",
},
compiles{
sys: "windows",
arch: "amd64",
},
}
for _, s := range systems {
os.Setenv("GOOS", s.sys)
os.Setenv("GOARCH", s.arch)
switch println(s.sys); s.sys {
case "darwin":
output = "output.dmg"
case "windows":
output = "output.exe"
case "android", "linux":
output = "output"
default:
println("Undefined")
}
cmd := exec.Command("go", "build", "-o", output, "main.go")
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("cmd.Run() failed with %v:nnoutput:nn%sn", err, out)
}
}
}
Я получил следующий вывод:
C:UsershasanDocumentsGoPlayEnv>go run build.go
darwin
android
cmd.Run() failed with exit status 2:
output:
# command-line-arguments
c:gopkgtoolwindows_amd64link.exe: running gcc failed: exit status 1
gcc: error: unrecognized command line option '-rdynamic'
linux
windows
Я попробовал то же самое в Mac OS и получил:
cmd.Run() failed with exit status 2:
output:
# command-line-arguments
/usr/local/go/pkg/tool/darwin_amd64/link: running clang failed: exit status 1
ld: unknown option: -z
clang: error: linker command failed with exit code 1 (use -v to see invocation)
И попробовал в Linux (Ubuntu WSL на Win10) и получил:
# command-line-arguments
/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/tmp/go-link-178415548/go.o:(.data 0x0): undefined reference to `x_cgo_callers'
/tmp/go-link-178415548/go.o:(.data 0x8): undefined reference to `x_cgo_init'
/tmp/go-link-178415548/go.o:(.data 0x10): undefined reference to `x_cgo_mmap'
/tmp/go-link-178415548/go.o:(.data 0x18): undefined reference to `x_cgo_munmap'
/tmp/go-link-178415548/go.o:(.data 0x20): undefined reference to `x_cgo_notify_runtime_init_done'
/tmp/go-link-178415548/go.o:(.data 0x28): undefined reference to `x_cgo_sigaction'
/tmp/go-link-178415548/go.o:(.data 0x30): undefined reference to `x_cgo_thread_start'
/tmp/go-link-178415548/go.o:(.data 0x38): undefined reference to `x_cgo_setenv'
/tmp/go-link-178415548/go.o:(.data 0x40): undefined reference to `x_cgo_unsetenv'
/tmp/go-link-178415548/go.o:(.data 0x48): undefined reference to `_cgo_yield'
collect2: error: ld returned 1 exit status
Комментарии:
1. Вы уверены, что хотите, чтобы ваш
GOARCH
былamd64
vsarm64
? Также какprintln
определяется (.. это опечатка вместоfmt.Println
?)2. используйте,
Printf
вместоPrintln
илиprintln
, то, что вы видите, является указателем на ошибку. не фактическая строка ошибки.3. Вы смотрели на github.com/golang/go/wiki/Mobile ? Также пример может быть сведен к
GOOS="android" GOARCH="amd64" go build -o output main.go
4. @jakub та же ошибка, мой код — это не что иное, как автоматизация одного и того же для нескольких систем.
5. @HasanAYousef — да, я говорю, что
go build
команда воспроизводит ошибку. Похоже, что для сборки для Android (и iOS) вам нужно выполнить больше шагов, чем простоgo build
. github.com/golang/go/wiki/Mobile wiki объясняет, как создавать для Android.