cmd/cgo:使用函数指针构建c-archive在Go 1.14中可以正常工作,但在1.15及更高版本中无法正常工作,

p8h8hvxi  于 4个月前  发布在  Go
关注(0)|答案(4)|浏览(41)

你正在使用的Go版本是什么( go version )?

$ go version
go version go1.15 darwin/amd64

这个问题在最新版本的发布中是否重现?

是的。

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/willie/Library/Caches/go-build"
GOENV="/Users/willie/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/willie/pkg/mod"
GONOPROXY="github.com/vitalsource/*"
GONOSUMDB="github.com/vitalsource/*"
GOOS="darwin"
GOPATH="/Users/willie"
GOPRIVATE="github.com/vitalsource/*"
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/willie/.asdf/installs/golang/1.15/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/willie/.asdf/installs/golang/1.15/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/willie/willie/cgotest/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/4z/2t7q40b14znb__08yd_p_znw0000gn/T/go-build009670235=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

我构建了一个Go c-archive静态库,用于在多个C/C++程序中使用。使用cgo构建c-archives在Go 1.15及以后的版本中以一种我无法理解的方式中断了。在Go 1.14中构建正常。我在这里放了一个简单的示例: https://github.com/willie/cgotest

你期望看到什么?

我期望能够构建一个没有错误的c-archive静态库。

你看到了什么?

# command-line-arguments
_cgo_export.c:29:3: error: unknown type name 'writeFunc'
3b6akqbq

3b6akqbq1#

这里的问题是

func HTTPGet(url *C.char, writeFunc C.writeFunc, writeFuncData unsafe.Pointer) (read int64) {

请注意,writeFunc既是Go参数名称,也是C类型名称。这导致生成的C代码中出现混淆。

72qzrwbm

72qzrwbm2#

是的!更改Go参数名称解决了问题。如此轻松的解决方法,让人松了一口气。感谢@ianlancetaylor提供的帮助。

ffscu2ro

ffscu2ro3#

@ianlancetaylor Ian,Go 1.17有什么要做的事情吗?还是应该把它移到Backlog中,直到修复的时间线变得更加明确?

frebpwbc

frebpwbc4#

将文本内容移动到待办事项列表中。

相关问题