【问题标题】:Which stage in C/C++ compilation process makes it system-dependend?C/C++ 编译过程的哪个阶段使其依赖于系统?
【发布时间】:2021-12-17 12:53:32
【问题描述】:

我正在阅读this 教程。只有链接阶段使编译c/c++代码系统依赖吗?汇编语言代码生成不是也依赖于系统吗?在这种情况下,系统、机器和处理器不是一回事吗?

【问题讨论】:

  • 编译和链接程序所涉及的一切都是系统相关的。该标准仅描述语言,而不是您如何编译和执行它。
  • @Barmer 链接阶段是否使用了 ABI?还是从编译阶段开始?
  • 目标文件的格式由 ABI 指定。调用链接器的命令及其参数取决于实现。
  • Clang 不直接转换为汇编,而是将与系统无关的 LLVM 字节码作为中间步骤,然后将其转换为汇编。
  • @SomOneElse 是的,您可以从 clang 中获取 *.ll 文件,它是 -emit-llvm

标签: c++ c compilation


【解决方案1】:

我猜你的意思是这个:

链接非常依赖于系统,因此将目标文件链接在一起的最简单方法是对您希望链接在一起的所有不同文件调用 clang。

他们的意思是链接的命令行语法是非常依赖于系统的。您可能必须明确告诉链接器应该包含哪些标准库文件,例如,哪些标准库文件因平台而异。但在所有平台上,clang 前端都知道如何正确调用链接器。本教程建议您通过 clang 进行链接,而不是直接调用链接器。

这当然不是编译中唯一依赖于系统的部分,但其他部分隐藏得更好。将-O2 之类的标志传递给 clang 可以实现各种依赖于 CPU 的程序转换,但您不必在命令行上告诉 clang 如何进行这些转换。

【讨论】:

  • -O2 不启用特定于 CPU 的优化,-march 可以。 -O 标志仅在从受支持的目标平台中选择的特定架构的功能内进行优化。而且默认的拱门不是-march=native,而是公分母。
  • @Ext3h 我的意思是默认架构可能是 x86、x64、ARM、PowerPC ......并且相同的标志适用于所有这些。
猜你喜欢
  • 2017-12-25
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 2011-02-14
  • 2013-09-01
  • 2015-06-05
相关资源
最近更新 更多