clang 中的 x86_64-pc-windows-msvc 和 x86_64-pc-windows-gnu 目标有什么区别

MAR*_*AR1 5 c clang

我知道一个使用 libstdc++ 而另一个使用 msvc 标准库,但是当我在不链接的情况下编译以下内容时有什么区别

int add(int a, int b) {return a + b;}
Run Code Online (Sandbox Code Playgroud)

生成的目标代码有什么不同吗?或者是否相同?其他目标之间有什么区别

命令将为 clang -c test.c -target x86_64-pc-windows-msvc/gnu

谢谢

Joh*_*ger 3

clang 中的 x86_64-pc-windows-msvc 和 x86_64-pc-windows-gnu 目标有什么区别

这两个版本针对不同的 C 语言实现而构建,在这种情况下,这意味着标准库、头文件和库搜索路径以及工具(尤其是链接器)。前者针对 Microsoft Visual C(++) 构建,后者针对 GNU C(我相信由 MinGW 和兼容工具链提供)。

生成的目标代码有什么不同还是相同

您可能一开始就没有获得任一或两个目标的任何目标代码。每一种都需要在系统上安装相应的开发组件,而Clang不提供这些组件,

如果两个目标实际上都是可行的,那么 Clang 不仅会使用所选目标标准库的函数,还会使用它的headers。根据程序的不同,这可能会产生略有不同的目标代码。

和其他目标有什么区别

据我所知,Windows 上的 GNU C 使用与 MSVC 相同的 ABI(函数调用约定、数据类型定义、布局规则等),因此两个目标在这些方面应该没有区别。对于大多数其他目标而言,情况并非如此。例如,如果您选择 32 位目标或 Linux 目标,那么您可能会遇到更大的差异,并且结果可能无法在构建计算机上运行。