GO如何实现执行SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64等命令并build成功?

letusgoAa · 2022-04-24 17:01:54 · 2966 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-04-24 17:01:54 的主题,其中的信息可能已经有所发展或是发生改变。

众所周知,在windows环境下编译linux上可执行程序的命令如下

SET CGO_ENABLED=0 
SET GOOS=linux
SET GOARCH=amd64
go build main.go

自已在windows上写的玩意有时候老是想放到不同环境上跑,每次编译就需要执行4条命令,很麻烦 于是简单弄了个build_linux.bat

set file=%1
if ""%1""=="""" set file=main.go
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build %file%

然后想用go也实现这个玩意

package main

import (
    "flag"
    "fmt"
    "os"
    "os/exec"
)

func main() {
    initFlag()
    buildFile()
}
func buildFile() {
    fmt.Println("*******")
    cmd(" CGO_ENABLED=0")
    cmd(" GOOS=" + GOOS)
    cmd(" GOARCH=" + GOARCH)

    cmd := exec.Command("go", "build", File)
    cmd.Env = os.Environ()

    fmt.Println(cmd)
    err := cmd.Run()
    if err != nil {
        fmt.Println("***err:", err)
        return
    }
}
func cmd(arg string) {
    // 怎么设置go env并生效?
    cmd := exec.Command("go", "env", arg)
    fmt.Println(cmd)
    err := cmd.Run()
    if err != nil {
        fmt.Println("***err:", err)
        return
    }
}

var (
    GOOS   string
    GOARCH string
    File   string
)

func initFlag() {
    flag.StringVar(&GOOS, "o", "linux", "目标平台的操作系统(darwin、freebsd、linux、windows)")
    flag.StringVar(&GOARCH, "a", "amd64", "目标平台的体系架构(386、amd64、arm)")
    flag.StringVar(&File, "f", "main.go", "需要编译的文件")
    flag.Parse()
}

然而上面的go demo只生效了 go build main.go 这条命令,并生成 main.exe文件,而不是理想上的linux可执行文件

求靓仔大佬解惑


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2966 次点击  
加入收藏 微博
6 回复  |  直到 2022-04-29 10:25:56
liangmanlin
liangmanlin · #1 · 3年之前
## 这样
go build -o main main.go
zhengjianyang
zhengjianyang · #2 · 3年之前

写个makefile就方便了

colin321
colin321 · #3 · 3年之前

不是os.Setenv()么

zhang-jianqiang
zhang-jianqiang · #4 · 3年之前

带着环境变量一起执行就行

Felixw
Felixw · #5 · 3年之前

SET CGO_ENABLED=0& SET GOOS=linux& SET GOARCH=amd64& go build main.go

letusgoAa
letusgoAa · #6 · 3年之前
colin321colin321 #3 回复

不是os.Setenv()么

对的,感谢靓仔,感谢大佬

os.Setenv("CGO_ENABLED", "0")
os.Setenv("GOOS", "linux")
os.Setenv("GOARCH", "amd64")
cmd := exec.Command("go", "build", File)
cmd.Env = os.Environ()
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传