【问题标题】:Is clang a standalone C compiler or does it need gcc?clang 是独立的 C 编译器还是需要 gcc?
【发布时间】:2015-09-08 00:11:26
【问题描述】:

我想在 Windows 上使用 clang 编译 C 代码。

我想知道它是否真的是一个可以做到这一点的独立编译器,还是它的目标有些不同?

我以前使用过它,但现在看来它是在任何 gcc 编译器(例如 mingw)之上的捎带。

如果我尝试全新安装 clang 64 位二进制文​​件(并且我隐藏了我的 mingw/gcc 目录),那么它找不到用于 Hello World 的 stdio.h。这是直接在 bin 目录 (C:\clang\bin) 内运行的。如果我取消隐藏 mingw,它会编译,但是我会收到这样的错误(一个 mingw 编译器在 c:\win 中):

c:\win\bin\ld.exe 找不到-lgcc_s

考虑到 clang 是一个 438MB 的安装,你会认为它会有自己的包含和库文件!我想用clang 代替 gcc。

那么,我做错了什么? (我也看到了一些关于无法找到 stdio.h 的问题,但它们没有帮助。当然 clang 必须能够自己编译 Hello World?!)

【问题讨论】:

  • 那是……公然错误。 FreeBSD 完全使用 Clang,根本不使用 GCC(也不再安装 GCC)。
  • Clang 和 GCC 都不包含 C 库。无论您如何部署,在某处都会有一个单独的 C 库。

标签: c windows clang


【解决方案1】:

您将编译器与链接器与标准库混淆。

Clang 是一个功能齐全的独立编译器。但它不提供标准库(包含stdio.h 的库)。传统上,在 Unix 系统上,操作系统必须提供它使用的标准库。但是由于您使用的是 Windows,所以它不会,并且无论出于何种原因,它都会找到安装了 MingW 的那些。有许多与 Clang 兼容的 C 标准库的免费实现。

最后,ld.exe 是链接器,而且它也传统上必须由系统提供。我相信有一个链接器 lld 是与 Clang 一起开发的,但无论出于何种原因,您下载的版本的打包器只是选择将 clang 配置为简单地调用 ld。

【讨论】:

  • 我使用过其他 C 编译器,例如 DMC、Pelles C、lccwin 和 TinyCC 以及 gcc。它们都带有自己的头文件、自己的链接器和自己的库文件。您是说 clang 不符合这种模式(尽管与大多数模式相比它的规模很大)?有个lld程序,但是比较诡异,连clang创建的hello.o文件都不识别!
  • 是的。它不适合 Windows 即用型捆绑模式。而且 Gcc 也不适合您提到的编译器的模式。 MingW(包含 GCC 的构建)可能,但不是 GCC。它甚至没有官方的二进制发行版。
  • 顺便说一下,Digital Mars 产品被称为“C 和 C++ 开发系统”,它包含的远不止一个编译器。
【解决方案2】:

Clang 是一个完全独立的编译器(完全从头开始编写,使用 LLVM)。您不需要 GCC 来使用 Clang,这可以在 FreeBSD 的情况下显示(他们完全用 Clang/LLVM 替换了 GCC,并且出于许可原因不再在基础中安装 GCC)。除了 GCC 之外,还有很多种不同的 C 编译器,只是 GCC 是最常见的。

但是,没有编译器提供标准 C 库(GCC 提供了一些奇怪的库,例如您尝试使用的库)。 C 库是单独提供的,您需要安装 C 库才能编译任何重要的 C 程序。 cannot find -lgcc_s 的错误消息告诉我,您正在尝试链接到 GCC 提供的某个库。在这种情况下,您可能希望通过安装 GCC 来安装该库(但请注意,您不需要 GCC 来使用 Clang。

看来您的 Clang 版本已被编译为使用 GNU 的链接 ld,而不是 LLVM 的链接 lld。因此,您需要 GCC 的链接器(或者您可以重新编译 clang 以使用 LLVM 的链接器,或者只编译目标文件并单独使用 lld)。

【讨论】:

  • 您确定默认链接器依赖项已编译到编译器二进制文件中吗?对我来说,这听起来像是一个非常无用的选择。
【解决方案3】:

我认为您缺少路径变量。安装后,您必须手动将 PATH 添加到 Windows 环境。

【讨论】:

  • PATH 指定可执行文件的搜索路径。 OP 能够调用编译器,但编译器找不到stdio.h。 PATH 与此无关。
  • 任何程序都可以调用PATH
  • 我没有说他应该添加到PATH中。他缺少一个 PATH 变量。
  • 我不明白你的意思。 %PATH% (Windows) 或 $PATH (Unix/Linux) 变量指定如何查找 gcc 或 clang 等可执行文件。 OP说他已经能够执行clang。问题是clang 找不到stdio.h。这不受%PATH%/$PATH 的控制。有一个包含文件的搜索路径,但它不称为“PATH”。如果您有解决方案,则需要更加具体。使用正确配置的系统,不需要显式添加任何内容。
  • 如果您不以管理员身份安装 clang,则必须手动将一些变量添加到 Environemt。
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 2012-01-05
  • 2017-10-17
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多