Скомпилировать на Android

#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 vs arm64 ? Также как 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.