【问题标题】:What is the difference? clang++ | clang -std=c++11有什么区别?铿锵++ |铿锵 -std=c++11
【发布时间】:2013-12-01 13:40:20
【问题描述】:

我错误地使用了这个命令,在链接步骤中失败了:

$ clang -std=c++11 -stdlib=libc++ myInputFile.cpp

谁能解释一下为什么 clang 提供了 C++ 语言选项,以及为什么它无法链接? 为什么选项 -x c++-std=c++11 不能完成与 clang++ 相同的事情?谢谢!

【问题讨论】:

  • 反对票是怎么回事?是的,我知道 clang++ 只是为 C++ 配置 clang 的链接。这不是我的问题,请再看一遍。如果它如此简单,请回答而不是投反对票。
  • 第 4 版中的这个问题是一个完全有效的问题,我认为没有任何理由投票结束或否决。这是一个“为什么……?”问题,但其范围足够小,有希望提供一个普遍同意的理由作为答案。
  • 问题中的std=c++11 stdlib=libc++应该是-std=c++11 -stdlib=libc++吗?
  • 当您尝试链接时收到什么错误消息?您是在链接问题中的命令还是其他命令?
  • @EricPostpischil 你是对的;这就是我不复制/粘贴的结果。我上次编辑了这个问题以反映这一点。

标签: c++ c c++11 clang clang++


【解决方案1】:

从技术上讲,名为clangclang++ 的程序都不是编译器:它们都是驱动程序,用于分析输入参数并确定在哪些文件上调用哪些编译器/汇编器/链接器使用什么命令行参数。两者之间的唯一区别是clang 在执行链接时只链接 C 标准库,而clang++ 链接同时针对 C++ 和 C 标准库。

-x=<language> 选项覆盖驱动程序用于确定源文件语言的启发式方法,它指示驱动程序调用 <language> 的编译器。

-std=<dialect> 选项选择您要使用的特定语言的方言。如果您需要确保您的 C++ 程序可移植到旧的 C++98 编译器,您可以使用 -std=c++98 编译它。 -std 仅适用于目标语言:它不会尝试编译,例如汇编器或 java 为 C++98,仅驱动程序认为是 C++ 的源文件。

简而言之,有两种不同的驱动程序可以让您轻松选择要链接的库。编译 C++ 但不链接 C++ 标准库有合理的用例。

【讨论】:

  • 类似于gcc vs g++,不是吗?
【解决方案2】:

Clang 是整个编译器的名称。

但是,从命令行的角度来看:

  • Clang 是 C 编译器
  • Clang++ 是 C++ 编译器(如 g++ 是 C++ 编译器,而 gcc 是 C 编译器)

-std=c++11 选项启用新的 C++11 标准(如在 g++ 中)。

【讨论】:

  • 但是,为什么要在 C 编译器中提供 C++ 选项标志呢?这是我的主要问题。
  • gcc 做事的方式保持兼容。
  • @djwbrown: clang 可能会弄清楚它何时在 C++ 代码上运行并成功生成目标文件。 clangclang++ 之间的区别在它尝试链接 C++ 需要与 C 不同的集合的目标文件时显示出来。clang 将尝试链接 C 和 clang++ C++ 代码。
  • @BenjaminBannier 有帮助,但如果 -x 或 -std= 标志也不会将链接器更改为正确的语言,为什么还要麻烦给你?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2012-02-25
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多