怎么样在Windows下使用Make编译Golang程序

简介: 怎么样在Windows下使用Make编译Golang程序

怎么样在Windows下使用Make编译Golang程序

GNU的Make是一个又古老又强大的构建工具,就Makefile的语法而言也不算复杂,没有特别复杂的需求的话,拿来做程序构建是一个好主意。更复杂一点的构建就可以选择Google的Bazel,但是通常的工程都没有这么复杂的需求。

在Unix、Linux、BSD、macOS使用Make是很方便的,很自然的。可是,在Windows下面却存在着兼容性的问题,在其他操作系统可以顺利执行的Makefile,在Windows却跑不了。这体验很糟糕。虽然微软在努力解决不兼容的问题,比如最新的PowerShell,但是操作系统毕竟还是存在着巨大的差异,要完全解决几乎是不可能完成的任务。所以,在Makefile多少是需要做一些适配。

安装Make

常规的做法,大家都是使用安装MinGW包的方法来安装Make,但是这很繁琐,我并不推荐,我推荐使用ChocoScoop来安装管理Make。

Choco

PowerShell安装Choco:

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

管理员权限启动PowerShell,然后运行以下命令进行安装:

choco install make

安装其他有用的工具:

choco install grep awk sed touch

scoop

安装Scoop:

irm get.scoop.sh | iex
scoop install make

安装其他有用的工具:

scoop install grep gawk sed touch

MinGW

下载安装MinGW:https://www.mingw-w64.org/downloads/

下载好之后,解压,把bin文件夹加入到Windows的环境变量里面,使之可以全局运行。

然后,还需要把mingw32-make.exe文件改名成make.exe

此方法比较繁琐,不如使用软件包管理器去直接安装make还方便多了。

另,通过软件包管理也能够安装mingw:

choco install mingw
scoop install mingw

Windows和Linux之间使用Make的区别

在Windows下使用Make和在Linux下面使用Make是有区别的,而这个差异性倒不是来自于Make,而是来自于依赖的命令。

Bash里面很多的命令,在CMD下都没有,PowerShell倒是增加了一些,像:manlsrmpwd这些常用的倒是都已经有了,但是差异还是有,兼容性永远是个大问题。

常用的Linux工具倒是有,像grepawksed……都可以通过上面的软件管理器choco、scoop安装到。但是,像uname这些平台严重相关的命令是肯定没有办法的。

简单举一些例子:

  1. 文件路径分隔符,Windows是\,而Linux是/;
  2. Linux的mkdir是有-p选项的,而Windows没有。
  3. echo的行为也跟Linux的不同。

现在PowerShell倒是在提高与Bash的兼容性,但是毕竟系统差异性太大,兼容性是肯定存在的,那么,怎么办呢?我们可以在Makefile里面判断操作系统的版本,来做差异化处理。

简单的探测系统版本:

detected_OS :=
ifeq ($(OS),Windows_NT) 
    detected_OS := Windows
else
    detected_OS := $(shell sh -c 'uname 2>/dev/null || echo Unknown')
endif

all:
    @echo $(detected_OS)

使用Makefile编译Golang程序

下面以一个简单的编译Golang程序的Makefile来讲解如何跨平台使用Makefile进行交叉编译:

GOPATH=$(shell go env GOPATH)
GOARCH?=$(shell go env GOARCH)

ifeq ($(OS),Windows_NT)
    IS_WINDOWS := 1
endif

BUILD_CMD = $(if $(IS_WINDOWS), \
    SET CGO_ENABLED=0&SET GOOS=$(1)&SET GOARCH=$(2)&go build -o .\bin\$(1)_$(2)\$(3), \
    CGO_ENABLED=0 GOOS=$(1) GOARCH=$(2) go build -o ./bin/$(1)_$(2)/$(3))

linux:
    $(call BUILD_CMD,linux,$(GOARCH),test)

windows:
    echo $(IS_WINDOWS)
    $(call BUILD_CMD,windows,$(GOARCH),test.exe)

mac:
    $(call BUILD_CMD,darwin,$(GOARCH),test)

上面这段代码里面使用ifeq ($(OS),Windows_NT)来判断操作系统,得到一个IS_WINDOWS的变量。

然后,定义了一个BUILD_CMD的函数,它调用了内置的if函数,它的语法是:

$(if <condition>,<then-part>,<else-part>)

第一个分支是走的Windows的编译,第二个分支是走的其他操作系统的编译。

需要注意的是:路径分隔符,参数设置前面需要加SET,语句之间需要用&间隔。

参考资料

目录
相关文章
|
8天前
|
Windows Python
python获取windows机子上运行的程序名称
python获取windows机子上运行的程序名称
|
6天前
|
安全 网络安全 API
基于WMI更新Windows系统信息采集程序sysInfo的一些收获
基于WMI更新Windows系统信息采集程序sysInfo的一些收获
|
8天前
|
小程序 Windows
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
|
2月前
|
监控 机器人 Unix
GoLand——windows下如何编译Linux二进制文件
GoLand——windows下如何编译Linux二进制文件
37 1
GoLand——windows下如何编译Linux二进制文件
|
2月前
|
JavaScript Windows
electron程序运行在某些 windows 上白屏
electron程序运行在某些 windows 上白屏
|
2月前
|
Linux Windows Python
最新 Windows\Linux 后台运行程序注解
本文介绍了在Windows和Linux系统后台运行程序的方法,包括Linux系统中使用nohup命令和ps命令查看进程,以及Windows系统中通过编写bat文件和使用PowerShell启动隐藏窗口的程序,确保即使退出命令行界面程序也继续在后台运行。
|
2月前
|
C++ Windows
Windows下编译64位CGAL
Windows下编译64位CGAL
36 0
|
2月前
|
编译器 Linux C语言
Windows下编译并使用64位GMP
Windows下编译并使用64位GMP
96 0
|
5月前
|
Windows
LabVIEW启用/禁用Windows屏幕保护程序
LabVIEW启用/禁用Windows屏幕保护程序
59 4
LabVIEW启用/禁用Windows屏幕保护程序
|
4月前
|
Windows
windows系统bat批处理 开机一键多个程序
windows系统bat批处理 开机一键多个程序
59 1

相关课程

更多
下一篇
无影云桌面