问题 编译器和链接器调试信息之间有什么区别?


我有点困惑为什么Delphi在编译时链接和调试信息时有调试信息。

它们之间有什么区别?


2276
2018-02-16 11:08


起源



答案:


编译器中的调试选项会将调试信息添加到 DCU 文件。

链接器中的调试选项将把所有调试都发现在 DCU 文件到exe / dll。

如果您使用的是FastMM4或memslueth,您将需要两个选项来帮助您找到任何故障。

如果您的发布代码应该禁用链接器选项,以大大减少您的exe大小(并保护您的IPR)。

如果你只发布了 DCU 如果您不提供源代码,则应在发布之前关闭编译器设置(作为第三方控件/库)。


14
2018-02-16 11:19



但是如果我只编译编译器中的调试选项,makexcept如何定位过程名称? - opc0de
它们是Delphi的DCU,而不是OBJ。如果您只发布已编译的代码,您可能希望发布两个版本的代码:使用和不使用调试进行编译。调试信息不​​仅是FastMM4和其他第三方调试器所必需的,它对IDE本身来说也是最重要的。 - Cosmin Prund
@ opc0de,看看吧 MAP 文件(也是链接器选项):这是将地址转换为模块和过程名称的最简单方法。 - Cosmin Prund
我从来没有使用过madexcept,但我希望你需要启用这两个选项,我永远不会禁用编译器选项,只使用链接器选项。感谢Cosmin纠正我的obj / dcu错误,我需要停止使用太多不同的编译器。 - Dampsquid
madexcept将地图信息添加到exe。当您将makexcept安装到IDE中时,它会在您编译/构建时自动为您执行此操作。使用命令行编译器时,需要使用实用程序。 IIRC它被称为madexceptpath.exe,位于madexcept安装文件夹中的某个位置。 - Marjan Venema


答案:


编译器中的调试选项会将调试信息添加到 DCU 文件。

链接器中的调试选项将把所有调试都发现在 DCU 文件到exe / dll。

如果您使用的是FastMM4或memslueth,您将需要两个选项来帮助您找到任何故障。

如果您的发布代码应该禁用链接器选项,以大大减少您的exe大小(并保护您的IPR)。

如果你只发布了 DCU 如果您不提供源代码,则应在发布之前关闭编译器设置(作为第三方控件/库)。


14
2018-02-16 11:19



但是如果我只编译编译器中的调试选项,makexcept如何定位过程名称? - opc0de
它们是Delphi的DCU,而不是OBJ。如果您只发布已编译的代码,您可能希望发布两个版本的代码:使用和不使用调试进行编译。调试信息不​​仅是FastMM4和其他第三方调试器所必需的,它对IDE本身来说也是最重要的。 - Cosmin Prund
@ opc0de,看看吧 MAP 文件(也是链接器选项):这是将地址转换为模块和过程名称的最简单方法。 - Cosmin Prund
我从来没有使用过madexcept,但我希望你需要启用这两个选项,我永远不会禁用编译器选项,只使用链接器选项。感谢Cosmin纠正我的obj / dcu错误,我需要停止使用太多不同的编译器。 - Dampsquid
madexcept将地图信息添加到exe。当您将makexcept安装到IDE中时,它会在您编译/构建时自动为您执行此操作。使用命令行编译器时,需要使用实用程序。 IIRC它被称为madexceptpath.exe,位于madexcept安装文件夹中的某个位置。 - Marjan Venema