用于删除调试信息的 MSVC 命令行选项

Posted

技术标签:

【中文标题】用于删除调试信息的 MSVC 命令行选项【英文标题】:MSVC command-line option to remove debug information 【发布时间】:2020-06-15 11:13:09 【问题描述】:

我在一个名为“hw.cpp”的文件中有以下简单的 C++ 程序:

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

    printf("Hello, world!\n");
    return 0;

用 gcc 9.3.0 (Ubuntu) 编译,结果如下:

gcc -g0 hw.cpp -o hw.out(禁用调试信息)=> 大小为 17k(如果删除了 -g0,则相同) gcc -g3 hw.cpp -o hw.out(最大调试信息)=> 大小为 44k

但 MSVC(cl 版本 19.26.28806)的默认编译输出一个更大的文件:

cl hw.cpp /link /out:hw.exe => 大小为 101k

为什么 MSVC 版本这么大?这与调试信息有关吗?如何禁用调试信息? cl.exe compiler options 与 gcc -gN 选项没有明显的等效项。

【问题讨论】:

这是一个 链接器 选项 (/DEBUG:NONE)。见my other answer。在/link 之后立即添加开关。 Documentation. @AdrianMole:谢谢,但命令cl hw.cpp /link /DEBUG:NONE /out:hw.exe 没有任何区别(大小仍为 101k)。语法对吗? 语法看起来不错。我猜 MSVC 是在可执行文件中添加各种运行时库的东西。 @AlainD gcc 是否默认链接到您环境中的静态或共享/动态 CRT? @dxiv:嗯,我该如何检查这个?...对不起,Linux 新手!新安装 Ubuntu 20.04,然后运行类似sudo apt install build-essential gcc g++ (etc) 的命令。没有用 gcc 配置任何特定的东西。 【参考方案1】:

这些是我看到的 hw.exe 大小,用于 C 运行时的静态/动态链接与调试/发布版本的组合,用于使用 VC++ 2019 对 hw.cpp 进行默认 32b 编译。

                   debug                 release
static      (cl /MTd)  279,040      (cl /MT)  101,888
dynamic     (cl /MDd)   10,240      (cl /MD)    8,192

动态链接到 VCRUNTIME140.DLL 运行时的 32b 版本构建 cl /MD hw.cpp 有 8k。 /MT 规模的巨大飞跃来自于静态链接核心 C 支持、流库等。

【讨论】:

能够使用 Windows 10 上的 VS 2019 社区使用 /MTx/MDx 选项确认所有这些大小(尽管我的静态链接调试版本为 278,528 字节)。谢谢!

以上是关于用于删除调试信息的 MSVC 命令行选项的主要内容,如果未能解决你的问题,请参考以下文章

调试信息是不是显示 C++/MSVC 中的代码?

Shell脚本的调试方法

Shell脚本的调试方法

SylixOS异常调试的手段

在 MSVC 2010 命令行中强制 32 位编译

[Qt] Release模式下产生调试信息