【问题标题】:What standard C library does Clang use? glibc, its own, or some other one?Clang 使用什么标准 C 库? glibc,它自己的,还是其他的?
【发布时间】:2020-03-20 01:01:01
【问题描述】:

我很确定 glibc 是 gcc 的标准 C 库实现的名称。

但对于 LLVM/Clang,我不确定。我已经用谷歌搜索了它是否带有自己的整个标准 C 库的实现,或者他们是否也使用 glibc。令人惊讶的是,我能找到的只是最近一篇讨论 Google is considering writing a new libc for LLVM 的文章。但不会取代它。

即使在 LLVM/Clang 源代码库中,我也很有可能只是盲目或愚蠢,但我似乎找不到它。

为了清楚起见,我只对 C 标准库感兴趣,而不是 C++ 标准库。我对研究他们对printf 系列函数的实现特别感兴趣。

谁能告诉我在哪里可以找到 Clang 的 libc/标准 C 库实现或其源代码库?

【问题讨论】:

  • @gman:我假设有些东西我不明白,因为后一个链接似乎只有 libc 的某些部分。 printf 和朋友似乎不在? (第一个链接似乎是我不需要的 C++ 标准库,除非它当然还包括 C 库?)
  • 为什么它必须只使用一个甚至提供自己的?你试图找出什么?

标签: printf glibc llvm-clang libc c-standard-library


【解决方案1】:

Clang 没有自带 C 标准库。而是"supports a wide variety of C standard library implementations"

包括 Mac OS 在内的类 Unix 系统自带。 Windows 没有。在 Windows 上,默认安排需要安装 Microsoft 的 Visual C 库。不过,似乎也可以在 Windows 上将 Clang 与 MinGW 的库一起使用。

【讨论】:

  • 也可以将clang 与 Microsoft Visual Studio C 和 C++ 库一起使用。
【解决方案2】:

但对于 LLVM/Clang 我不确定

不清楚您是在询问 clang 本身正在使用哪个 libc(如 clang 编译器二进制文件),还是在询问 @987654324 的 binary 是哪个 libc @产生由于编译和链接正在使用。

无论哪种情况,答案都是:您告诉它使用哪个 libc(在 clang 配置时,或在链接最终二进制文件时)。

它可以是 GLIBC、uClibc、Musl、Apple libc 或其他一些 libc。

最终,LLVM-libc 可能已经准备就绪,也可以使用了。

更新:

您是说每次安装 Clang 时用户都必须决定使用 libc 吗?

否:提供合适的默认值 -- 系统 libc,在 Linux 上通常是 GLIBC(但不总是),在 MacOS 上是 Apple libc。

我已经 10 多年没有接触过 Windows,但我怀疑 MSVCRT.DLL 最终会被默认使用。

但最终用户可以通过在编译和链接时使用合适的-I...-L... 标志来覆盖默认选择。

最终用户还可以通过重新配置和重建clang 来更改默认值。

【讨论】:

  • 啊。我问当我用 C 语言写“Hello world”并用 Clang 编译它时,哪组标准函数将链接到生成的可执行文件中?您是说每次安装 Clang 时用户都必须决定使用 libc 吗?当我将它安装在 Linux、Windows 或 Mac 中时,我没有看到这种情况发生。我不记得做过你所说的任何“告诉使用”。
  • 谢谢!它现在很有用。在 90 年代,我使用的 C 编译器都带有自己的 C 库,而且通常带有源代码。
  • 是的,from this answer on another SO question Windows 上的 Clang 似乎需要 Microsoft Visual C 的库。
  • 您对那些“合适的 -I... 和 -L... 标志”有什么具体说明吗?到目前为止,我所看到的所有内容都只涉及重建编译器以使用选定的 c std lib。
【解决方案3】:

编译 C++ 代码时,来自 GNU 的 libstdc++ 或 LLVM 的 libc++ 可以用作 C++ 标准库。它们分别通过使用标志-stdlib=libstdc++-stdlib=libc++ 编译clang++ 来设置。此信息在https://clang.llvm.org/docs/Toolchain.html 上的布局相当合理。

编译 C 代码时,不能在每次编译时切换 C 标准库。有必要为选定的 C 库构建整个编译器工具链。这意味着交叉编译,或者在 Linux 的情况下,在使用所选 C 库的发行版中编译。如果我想用 musl 编译,我会在 Alpine Linux 中编译,等等。

【讨论】:

    【解决方案4】:

    情况正在改变! - LLVM 正在开发自己的 libc 实现 https://github.com/llvm/llvm-project/tree/main/libc

    他们没有在几个版本中讨论过它:https://releases.llvm.org/12.0.0/docs/Proposals/LLVMLibC.html

    llvm-libc,[是] C 标准库目标的实现 C17 及更高版本,作为 LLVM 项目的一部分。 llvm-libc 也将 提供相关的平台特定扩展。例如,在 Linux 它还提供 pthreads、librt 和其他 POSIX 扩展 图书馆。

    我觉得最有趣的部分是:

    • 从一开始就设计和开发使用 LLVM 工具和测试,例如模糊测试和消毒剂支持的测试。

    • 尽可能使用基于源代码的实现而不是汇编。将尝试修复编译器,而不是使用汇编语言解决方法。

    看起来 LLVM 14 或 15 将与它一起发布。观看此空间以获取更多文档!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-27
      • 2011-08-01
      • 2019-02-21
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多