你使用的Go版本是什么( go version
)?
go version go1.11.5 windows/amd64
这个问题在最新版本的发布中是否重现?
是(go1.11.5)
你正在使用什么操作系统和处理器架构( go env
)?
go env
输出
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Andreas Jonsson\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\Andreas Jonsson\go
set GOPROXY=
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 GOMOD=
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\ANDREA~1\AppData\Local\Temp\go-build314745786=/tmp/go-build -gno-record-gcc-switches
你做了什么?
在Windows上使用Go1.11.5和TDM-GCC-64(mingw64)编译任何包,并使用VisualStudio 2015将库链接到一个小型应用程序中,并调用库中的任何C导出的Go函数。
你期望看到什么?
函数应该像应用程序使用Mingw构建时一样被执行。
你看到了什么?
当调用该函数时,应用程序陷入死锁,因为运行时等待srcruntime\cgo\gcc_libinit_windows.c:77中的'runtime_init_wait'对象。如果你使用VisualStudio 2015进行链接,看起来_rt0_amd64_windows_lib永远不会被调用(我怀疑后续版本也有同样的问题)。我还注意到在构建过程中有一个警告:“main.a(go.o) : warning LNK4078: 发现具有不同属性的多个'.text'部分”(60600060),我不确定这是否是问题的原因...?
4条答案
按热度按时间83qze16e1#
使用Visual Studio 2015将库与一个小应用程序链接
我可能错了,但我认为这不被支持。Go只在Windows上支持GCC C编译器。
Alex
l7mqbcuq2#
是的,那可能是个问题。:(
如果我们能添加对它的支持就很有趣了。不确定这需要多少工作?
我想这个问题与存档中的全局构造函数没有被VS链接器识别有关。作为一个测试,我尝试手动调用它。没用。:)但我不确定_rt0_amd64_windows_lib在寄存器设置等方面期望什么。
@dmitshur 所以也许这应该是一个标签问题?有人知道要做什么才能让它起作用吗?(即使可能也不可能。)
62o28rlo3#
如果我们能为其添加支持,那将是很有趣的。不确定这需要多少工作?
我不知道。抱歉。
这里有一个可能与此相关的#20982。
Alex
yvt65v4c4#
非常感谢。我一定错过了那个。
它相关。我没有尝试使用 MSVC 工具构建所有内容,但是如果 #20982 被合并,那对我的情况将是非常有帮助的。
谢谢