当必须启用CGO_时,会发生什么 问题:

当必须启用CGO_时,会发生什么 问题:,go,cross-compiling,Go,Cross Compiling,请帮助理解启用CGO_的时间必须且不可避免,以及go编译过程会发生什么 当必须启用CGO_时 阅读了《参考资料》中的文章后,就go对目标平台的交叉编译本机支持而言,CGO_ENABLED永远都不是必须的。这是正确的吗 cgo和cgo\u启用的情况是绝对的,必须是go编译器无法为目标平台生成二进制代码。例如,假设我正在用Go编写一个SpaceX控制板嵌入式程序,我必须使用C库和该板的编译器。没有其他库或编译器可用于该板 在这种情况下,我必须执行CGO_ENABLED=1并告诉CGO编译器和链接器要

请帮助理解启用CGO_的时间必须且不可避免,以及go编译过程会发生什么

当必须启用CGO_时 阅读了《参考资料》中的文章后,就go对目标平台的交叉编译本机支持而言,CGO_ENABLED永远都不是必须的。这是正确的吗

cgocgo\u启用的情况是绝对的,必须是go编译器无法为目标平台生成二进制代码。例如,假设我正在用Go编写一个SpaceX控制板嵌入式程序,我必须使用C库和该板的编译器。没有其他库或编译器可用于该板

在这种情况下,我必须执行CGO_ENABLED=1并告诉CGO编译器和链接器要使用,以及在我的笔记本电脑中复制C库二进制文件的位置,并设置编译器CFLAGS等。在这种情况下,我可能必须使用C进行所有编码,而不是使用Go,但不知何故,我处于不得不使用围棋的境地。此时必须启用CGO_ENABLED=1。这是正确的吗

否则,如果go支持目标平台交叉编译,那么使用CGO_ENABLED=1可能是为目标平台重新使用现有C库的捷径。这是正确的还是需要启用CGO_的其他原因

发生了什么 我假设当使用CGO_ENABLED=1时,基本上会有一个由Go部分的二进制文件和由Go build命令创建的可执行文件中C库的二进制文件组成的组合。在运行时,执行在go和C这两个二进制世界之间来回进行。go二进制端不知道C端,因此类似调试器的go工具将不可用

我认为可执行文件是硬链接所有库还是使用动态链接取决于目标平台编译器

这些认识正确吗

交叉编译默认情况下,CGO_ENABLED=0的原因是我们应该使用目标平台交叉编译的go内置支持,没有理由不这样做

本机本地平台默认情况下启用CGO_=1的原因是CGO编译器知道(或编译器的作者知道)本地机器体系结构和可用的操作系统库(或众所周知的第三方),因此可以预期最佳优化?但我不确定这是真的,因为go编译器本身可以针对本地操作系统和体系结构进行最佳优化,那么为什么需要使用cgo呢

请解释为什么本机本地平台默认情况下,CGO_ENABLED=1

工具书类
  • 有些人在遇到问题时会想“我知道,我会使用cgo。”现在他们有两个问题。

    cgo是一项惊人的技术,它允许Go程序与C库进行互操作。这是一个非常有用的功能,如果没有它,Go将不会处于今天的位置。cgo是在Android和iOS上运行Go程序的关键。

    然而,要明确的是,这是我的观点,我不是代表任何人说话,我认为cgo在Go项目中被过度使用了。我相信,当面对在Go中重新实现一大块C代码时,程序员会选择使用cgo来包装库,认为这是一个更容易处理的问题。我认为这是一个虚假的经济。

    显然,在某些情况下,cgo是不可避免的,最明显的是,您必须与图形驱动程序或窗口系统进行互操作,而图形驱动程序或窗口系统只能作为二进制blob提供。但cgo的使用证明了其权衡的合理性的案例比许多人准备承认的要少且远。

    Go对交叉编译的支持是同类中最好的。从Go 1.5开始,您可以使用Go项目网站上的官方安装程序从任何受支持的平台交叉编译到任何其他平台。

    默认情况下,交叉编译时禁用cgo。通常情况下,如果你的项目是纯围棋,这不是一个问题。当您混合依赖C库时,您必须放弃交叉编译产品的选项,或者必须投入时间为所有目标查找和维护交叉编译C工具链。

    Go支持的平台数量继续增长。Go 1.5增加了对64位ARM和PowerPC的支持。Go 1.6增加了对64位MIPS的支持,IBM的s390体系结构被吹捧为Go 1.7。RISC-V正在研制中。如果您的产品依赖于C库,那么您不仅面临上述交叉编译的所有问题,还必须确保您所依赖的C代码在Go支持的新平台上可靠地工作,并且必须以C/Go混合提供的有限可调试性来实现这一点。这就引出了我的下一点

  • “reference”Go实现的编译器(历史上称为“gc”;该编译器可从主站点下载)默认生成静态链接的二进制文件。这意味着,这些二进制文件只依赖于操作系统内核提供的所谓“系统调用”,而不依赖于操作系统(或第三方)提供的任何共享库。

    在基于Linux的平台上,这并不是完全正确的:在默认设置中(基于Linux for Linux构建,即不交叉编译),生成的二进制文件实际上与libc和libpthread链接(通过libc间接链接)

  • 默认情况下,对于系统上的本机构建,cgo工具处于启用状态,其中 预计它会起作用。默认情况下,当 交叉编译。您可以通过将CGO_设置为启用来控制这一点 环境变量