一尘不染

golang是否依赖于c运行时?

go

我找不到golang依赖于c运行时的信息吗?如果依赖它,它是否会在go-binary中静态编译以使Go-app可以在任何地方工作而无需依赖?

这是有关什么是C运行时的主题

libcmt是Microsoft编译器提供的C标准库的(几种)实现。它们提供三种基本类型的库的“调试”和“发行”版本:单线程(始终静态链接),多线程静态链接和多线程动态链接(尽管取决于您使用的编译器版本)使用,其中一些可能不存在)。

因此,在名称“ libcmt”中,“ libc”是(或多或少)C库的传统名称。“ mt”表示“多线程”。“调试”版本的末尾将添加“ d”,从而得到“ libcmtd”。

就其包含的功能而言,C标准(如果您很在意,请参见第7部分)定义了一组符合标准(托管)的实现必须提供的功能。大多数供应商(包括Microsoft)本身都会添加其他各种功能(出于兼容性,提供标准功能无法解决的功能等)。在大多数情况下,它还将包含许多编译器使用的“内部”功能但最终用户通常不会。

如果要在“ libcmt”中获得功能的完整列表(以使用示例为例),可以打开一个Visual Studio命令提示符(通常在“ Visual Studio Tools”下),切换到库所在的目录安装,然后输入类似的内容:lib -list libcmt.lib它将生成该库中所有目标文件名称的(长)列表。这些并不总是直接对应于函数的名称,但是通常会给出一个想法。如果要查看特定的目标文件,可以使用lib -extract提取这些目标文件之一,然后使用dumpbin /symbols <object file name>查找该特定目标文件中的功能。


阅读 374

收藏
2020-07-02

共1个答案

一尘不染

如果您正在谈论Go编译器提供的可执行文件,那么答案是“是或否-取决于”:

在大多数情况下,生成的可执行程序并 不能 依赖于C运行时库。

但是,在某些情况下,某些平台上会 动态
链接C运行时库。特别是在使用DNS解析的情况下,Linux上Go版本<1.5就是这种情况:运行时取决于平台的libc实现来处理这种解析。
在1.5中已对此进行了重做

另一个可能的情况是(IIRC)Solaris,它没有提供直接访问内核的syscall的稳定方法,并且需要通过平台的路由这些调用libc

还有另一种情况:使用cgo它是将Go代码与外部C代码接口的层。使用cgo使您的Go程序依赖于C运行时。请注意,您可能不会cgo直接使用,但是您正在使用的一个或多个第三方程序包可以使用cgo,并且(根据需要)您的程序最终取决于C运行时库。

2020-07-02