用于删除调试信息的 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 命令行选项的主要内容,如果未能解决你的问题,请参考以下文章