美文网首页
goland,cgo加载32位DLL遇到的问题

goland,cgo加载32位DLL遇到的问题

作者: 犭虫彳亍口苗 | 来源:发表于2019-01-18 17:01 被阅读0次

    第一次开发Go程序,使用Goland过程中遇到的一些问题,开发的Go后台需要使用到Windows的一个32位DLL动态库,此为原由,整个过程如下。

    GoLand环境配置

    1. file > setting > Go > GOPATH 添加当前项目路径
    2. 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解决此问题。步骤如下:

    1. 打开Run > Edit Configurations > Configuration标签
    2. 为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文件,每次都自动先把环境设置好。

    相关文章

      网友评论

          本文标题:goland,cgo加载32位DLL遇到的问题

          本文链接:https://www.haomeiwen.com/subject/dmnndqtx.html