为啥 clang 生成的二进制文件比 Visual Studio 生成的大

Posted

技术标签:

【中文标题】为啥 clang 生成的二进制文件比 Visual Studio 生成的大【英文标题】:Why the binary produced by clang is larger than that's produced by visual studio为什么 clang 生成的二进制文件比 Visual Studio 生成的大 【发布时间】:2016-12-05 11:50:51 【问题描述】:

这只是一段“hello world”C++ 代码。

#include <stdio.h>   
int main(int argc, char* argv[])

    printf("hello");
    return 0;

我用 clang 3.9 编译了代码。命令为:clang -m32 hello.cpp -o hello.exe,目标可执行文件大小约为44kb。将“O3”选项添加到命令中没有任何区别。

当我用Visual Studio 2010编译它时,目标可执行文件的大小对于发布版本只有6kb,对于调试版本只有28kb

谁能帮助解释两个版本的二进制文件之间的区别。 任何帮助将不胜感激。

【问题讨论】:

我的水晶球说 Clang 默认静态链接运行时库,而 MSVC 默认动态链接它们。这意味着 MSVC 生成的二进制文件更小,但需要一个辅助运行时 DLL。检查您的编译器/链接器设置以验证是否确实如此。 你也可以试试 -Oz 标记 Clang。 @CodyGray 谢谢。你的水晶球是否知道如何动态链接运行时库。我在没有任何提示的情况下进行了谷歌搜索。 @arrowd -Oz 标志不会改变任何东西。无论如何谢谢。 【参考方案1】:

我使用接受标志 /MD 而不是 clang 的 clang-cl。问题已解决。我还需要探索一下clang和clang-cl有什么区别。

【讨论】:

不知道用于动态链接的原生 Clang 标志是什么。 clang-cl 是 Clang 编译器的前端/包装器,提供与 MSVC 编译器 cl.exe 兼容的接口。按照您描述的方式进行操作是绝对安全的。

以上是关于为啥 clang 生成的二进制文件比 Visual Studio 生成的大的主要内容,如果未能解决你的问题,请参考以下文章

为Visual Studio项目生成clang编译数据库

在这种特殊情况下,为啥 gccgo 比 gc 慢?

为啥我的 Visual Studio .obj 文件比输出的 .exe 文件大?

Clang vs GCC - 产生更快的二进制文件? [关闭]

Emscripten Clang 生成 ELF 64 位可执行文件和 wasm 二进制交叉编译器目标

为啥 gcc 的输出比 Visual Studio 慢得多(对于此代码)?