第一次开发Go程序,使用Goland过程中遇到的一些问题,开发的Go后台需要使用到Windows的一个32位DLL动态库,此为原由,整个过程如下。
GoLand环境配置
- file > setting > Go > GOPATH 添加当前项目路径
- file > setting > Go > Vendoring & BuidTags 配置项如下
- os: 目标系统,此处选择windows
- Arch: 因为需要加载的DLL动态库是32位的,此处选择了386
- Go version: 默认
- Complier: 应该是选择编译器,直接选择Any
- CGO support: 选择Enabled
- Custom tags: 暂时不知道什么作用
执行
在按照上述方式配置好环境,并尝试使用CGO加载DLL时,执行GOLAND的DEBUG提示如下。
#runtime/cgo
cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
经过搜索猜测,是目标机器架构选择错误导致的。
但是在环境配置中,已经正确的选择了Arch为386,尝试使用liteIDE或者直接使用命令行编译,都能够正常编译。唯独使用GoLand不行。
看现象应该是设置没有生效,最后尝试在Run/Debug Configurations再次设置Go env解决此问题。步骤如下:
- 打开Run > Edit Configurations > Configuration标签
- 为Environment添加两个设置项
GOARCH = 386
CGO_ENABLED = 1
再次点击debug,发现debug失败,提示如下内容。
unsupported architecture of windows/386 - only windows/amd64 is supported
这是因为,goland在debug时使用的是dlv插件,该插件还不支持32位程序的调试,直接执行run就可以了。
一些总结
在使用命令行编译go程序时,可以使用go env命令查看当前编译环境设置。
E:\XXX-src\XXX>go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\XXX\AppData\Local\go-build
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=E:\cartronics-src\BDtest.src;D:\Go\comgopath
set GORACE=
set GOROOT=C:\Go
set GOTMPDIR=
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\XXX\AppData\Local\Temp\go-build120530514=/tmp/go-build -gno-record-gcc-switches
假如需要修改 GOARCH为386,继续输入命令行 set GOARCH=386 即可,如果重新打开cmd终端,则需要重新设置。所以如果使用命令行编译,可以写一个bat文件,每次都自动先把环境设置好。
网友评论