go version
$ go version 1.17.7
是的。
运行了 CGO_ENABLED=0 ./make.bash 。
CGO_ENABLED=0 ./make.bash
我期望它能生成一个遵循cgo文档行为(即,主机构建默认启用cgo)的编译器。
结果编译器即使对于主机也默认禁用了cgo,这已经由 go env 确认。
go env
qnzebej01#
这是按照预期工作的,参考 #12808
nuypyhwy2#
@seankhliao 这种行为并不完全体现在make.bash的当前文档中。
这并不清楚它实际上会在生成的编译器中烧录一个默认值。可能需要两个不同的标志:
uurity8g3#
当前行为按预期工作。我们今天不会改变CGO_ENABLED的工作方式。重新打开以澄清文档。
CGO_ENABLED
2uluyalo4#
我们今天不会改变CGO_ENABLED的工作方式。@ianlancetaylor 我希望你能重新考虑一下这个问题。今天,如果我从Alpine镜像构建一个针对Linux的编译器(是的,我知道这还不完全受支持),那么我的选择有以下两种:
CGO_ENABLED=0
CGO_ENABLED_FOR_$GOOS_$GOARCH
CGO_ENABLED=0 CGO_ENABLED_FOR_linux_amd64=1
CC_FOR_$GOOS_$GOARCH
CGO_ENABLED=1
2j4z5cfb5#
我不反对添加 CGO_ENABLED_FOR_${GOOS}_$(GOARCH} ,或者更简单地说,添加 CGO_ENABLED_FOR_TARGET 。我反对的是改变 CGO_ENABLED 当前的意义。
CGO_ENABLED_FOR_${GOOS}_$(GOARCH}
CGO_ENABLED_FOR_TARGET
kuhbmx9i6#
我们正在计划对cgo在std中的处理方式进行一些更改,届时可能值得重新审视这种行为。目前我们应该暂时搁置这个问题。
zpjtge227#
对于那些寻找原始问题解决方法的人,在linux/amd64上,你可以明确地将GOHOSTARCH=386设置为欺骗make.bash,让它认为正在进行交叉编译,因此它将生成一个默认启用cgo的没有cgo的编译器。请注意,你还需要安装gcc-multilib,因为引导编译器仍然会使用cgo进行编译。
GOHOSTARCH=386
gcc-multilib
7条答案
按热度按时间qnzebej01#
这是按照预期工作的,参考 #12808
nuypyhwy2#
@seankhliao 这种行为并不完全体现在make.bash的当前文档中。
CGO_ENABLED: 控制构建过程中的cgo使用。将其设置为1以包含所有与cgo相关的文件,即带有"cgo"构建指令的.c和.go文件。将其设置为0以忽略它们。
这并不清楚它实际上会在生成的编译器中烧录一个默认值。可能需要两个不同的标志:
请重新打开此问题。
uurity8g3#
当前行为按预期工作。我们今天不会改变
CGO_ENABLED
的工作方式。重新打开以澄清文档。
2uluyalo4#
我们今天不会改变CGO_ENABLED的工作方式。
@ianlancetaylor 我希望你能重新考虑一下这个问题。今天,如果我从Alpine镜像构建一个针对Linux的编译器(是的,我知道这还不完全受支持),那么我的选择有以下两种:
CGO_ENABLED=0
构建,这会产生一个默认不执行cgo的编译器,但会产生意想不到的副作用。CGO_ENABLED=0
构建,生成一个无法使用的编译器,它与musl链接。我认为如果有
CGO_ENABLED_FOR_$GOOS_$GOARCH
环境变量,会更合理(也更一致),这些环境变量可以为构建的编译器设置默认值。这样可以实现两个目标:CGO_ENABLED=0 CGO_ENABLED_FOR_linux_amd64=1
并得到预期的结果。CC_FOR_$GOOS_$GOARCH
的人可以通过不为他们预先选择的C编译器的目标显式设置CGO_ENABLED=1
来提高他们的体验。2j4z5cfb5#
我不反对添加
CGO_ENABLED_FOR_${GOOS}_$(GOARCH}
,或者更简单地说,添加CGO_ENABLED_FOR_TARGET
。我反对的是改变CGO_ENABLED
当前的意义。kuhbmx9i6#
我们正在计划对cgo在std中的处理方式进行一些更改,届时可能值得重新审视这种行为。目前我们应该暂时搁置这个问题。
zpjtge227#
对于那些寻找原始问题解决方法的人,在linux/amd64上,你可以明确地将
GOHOSTARCH=386
设置为欺骗make.bash,让它认为正在进行交叉编译,因此它将生成一个默认启用cgo的没有cgo的编译器。请注意,你还需要安装gcc-multilib
,因为引导编译器仍然会使用cgo进行编译。