当前位置: 首页 > 面试题库 >

golang是否依赖于c运行时?

丰辰沛
2023-03-14
问题内容

我找不到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>查找该特定目标文件中的功能。


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 可以运行以了解模块任务的依赖性。有没有办法找到 buildscript依赖 的 传递依赖 ? 示例: 直接取决于: 可以在MVNRepository上看到。但是,这些工件有其自己的依赖性。有没有找到方法而无需手动遍历整个依赖树的方法? 为了澄清起见,我正在谈论的类路径由以下方式定义: 问题答案: 您可以使用以下命令: Udacity提供了很棒的Android Gradle 教程,但是您

  • 这个答案表示,python中整数的endianness取决于处理器体系结构。这是否意味着像 根据处理器的不同,在不同的计算机上产生不同的结果? 一位同事建议我使用而不是

  • 注意:如果使用相同的代码,但基于单线程,所有的运行都很好。

  • 我开始使用SBT开发Scala应用程序。我发现我需要两个依赖项作为开始,所以这是scala-swingU实用程序和javax.swing.SwingU实用程序。我一直在搜索网络、maven仓库和github,但仍然找不到javax.swing包去哪里了。到目前为止,我已经在Maven Repos中找到了javax,但由于某种原因,javax.swing没有在那里列出。 我试图将javax依赖项添加

  • 问题内容: 运行时,输出: 但是,当我再次运行后,所有测试都通过了。 仅当我重置mysql数据库然后首次运行时,测试才会失败。 对于每个请求,我都会做一个请求,以确保在数据库中创建了数据。 谁能帮助我确保测试按顺序运行?那是请求在请求之前运行? 问题答案: 您不能/不应该依赖测试执行顺序。没有定义测试的执行顺序,并且使用测试标志可以排除测试的运行,因此您无法保证它们将完全运行。 例如,以下命令将仅

  • 移除运行时环境依赖 运行时系统 对于大多数语言,他们都使用了运行时系统(Runtime System),这可能导致 main 函数并不是实际执行的第一个函数。 以 Rust 语言为例,一个典型的链接了标准库的 Rust 程序会首先跳转到 C 语言运行时环境中的 crt0(C Runtime Zero)进入 C 语言运行时环境设置 C 程序运行所需要的环境(如创建堆栈或设置寄存器参数等)。 然后 C