利用msys2搭建开发环境-Golang篇


概述

之前总结了一些msys2使用中遇到的问题,但是不系统,有些问题也没有深究,解决了就忘记了。最近在新的机器上配置环境的时候发现一些问题,这次干脆写一个完整的配置过程。防止以后遗忘。

本系列将分为几个连载内容发布,分别为:

  1. 利用msys2搭建开发环境-基础配置篇
  2. 利用msys2搭建开发环境-Git篇
  3. 利用msys2搭建开发环境-golang开发环境篇

本节将开始本系列的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会有这个问题。使用官方下载的版本没有这个问。具体原因没有深究。

Archives