x/cmd/gotype: 未声明的名称: _Ctype_struct_bpf_program

htrmnn0y  于 7个月前  发布在  Go
关注(0)|答案(2)|浏览(91)

Cgo结构类型的形式为_Ctype_struct_似乎对gotype来说是未知的。

你正在使用哪个版本的Go(go version)?

go version go1.10.2 linux/amd64

这个问题在最新版本中是否会重现?

是的

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

GOARCH="amd64"
GOOS="linux"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"

你做了什么?

使用gotype对一个导入github.com/google/gopacket/pcap的虚拟包进行lint检查。
$ go get -u github.com/google/gopacket/pcap

$ cat $GOPATH/src/github.com/google/dummy/dummy.go
package dummy
import _ "github.com/google/gopacket/pcap"

$ gotype dummy.go

你期望看到什么?

没有输出(一切都正常)。

你看到了什么?

dummy.go:2:10: could not import github.com/google/gopacket/pcap (type-checking package "github.com/google/gopacket/pcap" failed ($GOPATH/src/github.com/google/gopacket/pcap/pcap.go:533:49: undeclared name: _Ctype_struct_bpf_program))

直接在gotype上运行得到:

$ gotype pcap.go
pcap.go:533:49: undeclared name: _Ctype_struct_bpf_program
pcap.go:203:7: undeclared name: _Ctype_struct_bpf_program
pcap.go:661:66: undeclared name: _Ctype_struct_bpf_program
pcap.go:801:34: undeclared name: _Ctype_struct_pcap_addr
pcap.go:401:17: invalid operation: p.pkthdr (variable of type *invalid type) has no field or method ts
pcap.go:403:19: invalid operation: p.pkthdr (variable of type *invalid type) has no field or method ts
pcap.go:406:27: invalid operation: p.pkthdr (variable of type *invalid type) has no field or method caplen
pcap.go:407:20: invalid operation: p.pkthdr (variable of type *invalid type) has no field or method len
pcap.go:425:4: invalid operation: p (variable of type *Handle) has no field or method waitForPacket
pcap.go:488:13: undeclared name: _Ctype_struct_pcap_stat
93ze6v8z

93ze6v8z1#

(CC: @alandonovan@griesemer )

yxyvkwin

yxyvkwin2#

go/types 并不了解 C;它只知道它所呈现的 .go 文件(或包)。由于 go/types 不是通过 go 命令运行的,因此不会运行 cgo,它也看不到 cgo 生成的文件(其中包含相关定义)。
当 go/types 看到一个 import "C" 时,它会“伪造”这个导入,并静默地抑制所有形式为 C.foo 的限定标识符产生的错误。因此,它对于 C.foo 风格的标识符“工作”得还可以。
没有简单的解决方法。

相关问题