`cmd/go`: 使用 `-compiler=gccgo` 应该可以构建 C 文件,即使 `CGO_ENABLED=0`,

eeq64g8w  于 6个月前  发布在  Go
关注(0)|答案(1)|浏览(47)

在使用gccgo时,有时需要在一个包中包含C文件以提供在使用gc时将实现的功能。但是,如果环境变量CGO_ENABLED=0存在,tip cmd/go不会构建这些C文件。这导致一些有效的包在使用gccgo时无法构建。
正确的修复方法可能是:如果包具有import "C",则在CGO_ENABLED=0存在时不应构建C文件。但是,如果包没有import "C",则应构建C文件。
一个使用此功能的示例包是golang.org/x/sys/unix。使用go工具的gccgo版本(我在这里需要使用gccgo版本,因为https://golang.org/cl/219817尚未移植到主要的go工具):

go test
PASS
ok golang.org/x/sys/unix 0.863s
CGO_ENABLED=0 gccgoenv go test

golang.org/x/sys/unix.test

/home/iant/gopath/src/golang.org/x/sys/unix/gccgo.go:48: error: undefined reference to 'golang.x2eorg..z2fx..z2fsys..z2funix.realSyscallNoError'
/home/iant/gopath/src/golang.org/x/sys/unix/gccgo.go:21: error: undefined reference to 'golang.x2eorg..z2fx..z2fsys..z2funix.realSyscallNoError'
/home/iant/gopath/src/golang.org/x/sys/unix/gccgo.go:28: error: undefined reference to 'golang.x2eorg..z2fx..z2fsys..z2funix.realSyscall'
/home/iant/gopath/src/golang.org/x/sys/unix/gccgo.go:35: error: undefined reference to 'golang.x2eorg..z2fx..z2fsys..z2funix.realSyscall'
/home/iant/gopath/src/golang.org/x/sys/unix/gccgo.go:42: error: undefined reference to 'golang.x2eorg..z2fx..z2fsys..z2funix.realSyscall'
/home/iant/gopath/src/golang.org/x/sys/unix/gccgo.go:53: error: undefined reference to 'golang.x2eorg..z2fx..z2fsys..z2funix.realSyscall'
/home/iant/gopath/src/golang.org/x/sys/unix/gccgo.go:21: error: undefined reference to 'golang.x2eorg..z2fx..z2fsys..z2funix.realSyscallNoError'
/home/iant/gopath/src/golang.org/x/sys/unix/gccgo.go:21: error: undefined reference to 'golang.x2eorg..z2fx..z2fsys..z2funix.realSyscallNoError'
collect2: error: ld returned 1 exit status
FAIL golang.org/x/sys/unix [build failed]

相关问题