Visual studio g++';s-g选项相当于VS2010 cl编译器?

Visual studio g++';s-g选项相当于VS2010 cl编译器?,visual-studio,debugging,visual-c++,visual-c++-2010,compiler-options,Visual Studio,Debugging,Visual C++,Visual C++ 2010,Compiler Options,使用g++With,我可以使用gdb进行调试 Visual Studio 2010 cl.exe编译器与此选项的等效项是什么 这有不同的库(调试/发布)用于链接 如果我使用cl.exe使用调试选项编译,我是否必须使用相应的库链接选项(/MD/MT vs/MDd/MTd)?您正在查找(/Z7、/Zi或/Zi)之一 如果使用其中一个选项,还应将该选项传递给链接器 您还需要根据运行库的链接(/MDd或/MTd)。这一点很重要,因为这些版本与发行版不同(例如,它们的内存分配例程不兼容)。这个问题有几个单

使用g++With,我可以使用gdb进行调试

Visual Studio 2010 cl.exe编译器与此选项的等效项是什么

这有不同的库(调试/发布)用于链接


如果我使用cl.exe使用调试选项编译,我是否必须使用相应的库链接选项(/MD/MT vs/MDd/MTd)?

您正在查找(
/Z7
/Zi
/Zi
)之一

如果使用其中一个选项,还应将该选项传递给链接器


您还需要根据运行库的链接(
/MDd
/MTd
)。这一点很重要,因为这些版本与发行版不同(例如,它们的内存分配例程不兼容)。

这个问题有几个单独的部分:如何告诉编译器/链接器生成并保留“调试信息”(源代码和目标代码之间的映射),如何告诉编译器以不同的方式编译代码以使调试更容易(想想assert()和#ifdef_DEBUG),以及链接到项目中的预编译库是否包含调试信息

-Zi(CL编译器告诉它生成调试信息的标志)相当于gcc的-g标志

(还有其他形式的-Z选项:-ZI,如果您想要“编辑并继续”Visual Studio IDE中的支持,但如果使用IDE,则可能使用其编译器设置接口,而不是直接操作它们;如果需要旧的CodeView格式调试信息,则使用-Z7;每当我直接调用CL时,我想要的总是-Zi。)

请注意,使用-Zi(或-Zi)选项通常会为每个目录生成一个.pdb文件,但当您将代码链接在一起时,它可能来自不同的.pdb文件中表示的.obj文件,您还希望将这些单独的.pdb文件合并到一个主文件中,该主文件表示链接在一起的代码——这就是链接器的-debug开关的作用

还要注意:这听起来可能违反直觉,但始终使用-Zi(对于CL)和-debug(对于link.exe)。即使是你要发布的代码。它不会增加可执行文件的大小,也不会向客户泄露秘密,因为调试信息保存在单独的.pdb文件中(您不会将其发送给客户)。如果您有可能不得不调试它,那么您将需要.pdb。(-Zi甚至与优化不兼容,尽管-Zi是。因此,您可能希望用-Zi编译“调试”版本,用“-Zi-O2”编译“发布”版本。)

至于库:您不需要严格地将C运行时库的debug/release属性与代码是否包含调试信息相匹配,但这通常是一个好主意——如果要调试项目,您希望能够调试所有项目,如果不打算调试,则不需要额外的权重。使用给定库的调试/发布版本不会影响该库是否有可用的调试符号(如果编译该库的人理解我在上一段中提出的观点,则希望如此),但会影响该库中的断言和额外的ifdef调试代码

这适用于您链接的所有库,尤其是C运行时库——Microsoft在malloc()和free()中添加了额外的错误检测代码。因此,如果您的项目中有任何东西使用CRT库的调试风格,那么所有这些都应该使用


在我看来,/M选项(/MTd和/MDd)既奇怪又神奇——它们只是幕后发生的一系列复杂事情的别名。以/MDd为例,它被记录为“定义_DEBUG、_MT和_DLL,并使您的应用程序使用特定于调试多线程和DLL的运行时库版本。它还使编译器将库名msvcrd.lib放入.obj文件中。”在这里,它会影响预处理器(定义#调试和其他一些预处理器符号)和链接器(它实际上在源代码中放置了一个#pragma注释(链接器)。如果您关心正在发生的事情而不了解它,这可能会导致真正的问题--我看到很多不使用IDE的项目都陷入了有关链接msvcrt.lib和msvcrd.lib的警告中,等等。当您了解如何使用这些(/M选项)时安全地说,你真的不再需要它们了!我更喜欢把事情明确化:在需要的地方直接指定“-D_DEBUG”,指定要显式链接的库(并使用-nodefaultlib),然后就不需要/M选项了。

+1哇。请问你是如何熟悉Microsoft工具链的特性的多年来使用不同版本的MSVC,很多跨平台项目,所以我们使用makefiles或绕过IDE的构建系统,使用由第三方构建的开源库,在升级到新版本的MSVC或SDK时保持整个工作状态,等等:)