概述
之前总结了一些msys2使用中遇到的问题,但是不系统,有些问题也没有深究,解决了就忘记了。最近在新的机器上配置环境的时候发现一些问题,这次干脆写一个完整的配置过程。防止以后遗忘。
本系列将分为几个连载内容发布,分别为:
本节将开始本系列的Golang开发环境配置,本节将介绍如何基于pacman包管理器安装golang,以及如何使用cgo进行开发。
安装Gcc
按照前面的《利用msys2搭建开发环境-基础配置篇》教程,安装GCC环境,该教程选择的gcc是基于mingw64的。各位可根据自己的情况选择其他的环境。
安装Golang
建议手动安装,当然也可以用pacman安装。
手动安装,直接下载官方压缩包,解压到某个分区的根目录即可,这样方便查找。我一般放在C盘或D盘。
使用msys2的pacman安装
pacman -Sy mingw-w64-x86_64-go
安装成功后go的根目录为D:\msys64\mingw64\lib\go,这个因msys2实际安装目录会有不同。
环境变量
golang安装成功后需要配置以下环境变量。GOROOT和GOPATH下的bin目录需要添加到PATH中。
GO111MODULE=ON
GOPROXY=https://goproxy.cn,direct
GOROOT=D:\go
GOPATH=E:\go
PATH=%GOROOT%\bin;%GOPATH%\bin
使用gcc编译C代码
用了msys2就是为了能方便的使用cgo。前面基础环境篇,已经安装好了gcc环境。
创建一个go文件main.go内容如下:
package main
// 引入c语言代码
/*
#include <stdio.h>
#include <stdlib.h>
void myprint(char* s) {
printf("%s\n", s);
}
*/
import "C"
import "unsafe"
func main() {
cs := C.CString("Hello from stdio\n")
C.myprint(cs)
C.free(unsafe.Pointer(cs))
}
启动msys2的终端,运行如下代码:
CGO_ENABLED=1 go run main.go
得到输出:
Hello from stdio
环境变量CGO_ENABLED是用来控制golang 编译期间是否支持调用 cgo 命令的开关,其值为1或0,默认情况下值为1,可以用 go env 查看默认值。如果程序中没有调用cgo的话,变量CGO_ENABLED的值对编译的结果没有影响。
Makefile
有了mingw64,基本上linux上可以用的工具,都可以使用了,比如make,gcc等。下面提供一个简单的makefile的范本。
SHELL=/usr/bin/bash
APP=app
TAG=1.0
APP_NAME=home_yard
BIN=${APP}
GO_VERSION=1.18.3
DEBUG_GCFLAGS="all=-N -l"
DIST_DIR=dist
APP_DIR=${DIST_DIR}/app
ifeq (${OS},Windows_NT)
ROOT_PATH=$(shell cygpath -w $(shell pwd) | sed "s@\\\\@\\\\\\\\@g")
BIN = ${APP}.exe
else
ROOT_PATH = $(shell pwd)
endif
.PHONY:init
init:
mkdir ${DIST_DIR}
.PHONY: build
build:
go build -o ${DIST_DIR}/${BIN}
.PHONY: run
run:
go build -race -o ${ROOT_PATH}/go_build_run_${BIN}
${ROOT_PATH}/go_build_run_${BIN} -listen ${RUN_PORT}
.PHONY: clean
clean:
go clean
rm -Rf ${DIST_DIR}
问题处理
问题1:使用msys安装的golang编译参数带-race时报以下错误
/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.1.0/../../../../lib/libmsvcrt.a(/359): duplicate symbol reference: _unlock_file in both libgcc(.text) and libgcc(.data)
libgcc(.text): relocation target atexit not defined
make: *** [Makefile:27:run] 错误 2
经测试如果是用pacman安装的golang会有这个问题。使用官方下载的版本没有这个问。具体原因没有深究。