Delphi 在编译时,是否可以将.map文件添加为项目的资源?

Delphi 在编译时,是否可以将.map文件添加为项目的资源?,delphi,resources,delphi-7,delphi-10-seattle,map-files,Delphi,Resources,Delphi 7,Delphi 10 Seattle,Map Files,我想将map文件添加为资源,然后每次执行系统时都提取该文件,以确保map文件始终正确,并使支持工作更轻松。在Delphi7中,我可以使用映射文件作为资源来编译项目,但是映射是错误的,因为当引发异常时,调用堆栈是错误的。在Delphi西雅图,我甚至无法编译,因为它试图在生成地图之前添加资源。我知道我可以在编译后的任务中添加该文件,但是有没有办法在编译/构建时完成? 对不起,如果我不是很具体,这是我的第一个问题。谢谢 更新 在我读了一些答案之后,我做了一些研究。我已经在我的项目中使用了绝地例外单位,

我想将map文件添加为资源,然后每次执行系统时都提取该文件,以确保map文件始终正确,并使支持工作更轻松。在Delphi7中,我可以使用映射文件作为资源来编译项目,但是映射是错误的,因为当引发异常时,调用堆栈是错误的。在Delphi西雅图,我甚至无法编译,因为它试图在生成地图之前添加资源。我知道我可以在编译后的任务中添加该文件,但是有没有办法在编译/构建时完成? 对不起,如果我不是很具体,这是我的第一个问题。谢谢

更新

在我读了一些答案之后,我做了一些研究。我已经在我的项目中使用了绝地例外单位,但我不认识绝地调试专家。这正是我想要的,而且更多。 绝地调试专家将.map文件转换为.jdbg文件,这是一个加密的map文件(map只是一个文本文件)。此外,jdbg文件比映射文件小约12%。它还可以选择将jdbg插入二进制文件(exe)。为此,我启用了以下选项:

  • 项目->JCL调试专家->生成.jdbg文件->为此项目启用

  • 项目->JCL调试专家->将jdbg数据插入二进制->为此项目启用

  • Project->JCL Debug expert->转换后删除映射文件->为此项目启用(当然,如果要删除文件)

为了在IDE之外使用这个工具,例如Jenkins,我必须在JEDI\jcl\examples\windows\debug\tools\MakeJclDbg.dpr中构建可用的项目。构建后,它将在jcl的bin目录中生成exe文件。如何使用:

MakeJclDbg-J-E-M映射文件名

J-创建.JDBG文件

E-将调试数据插入可执行文件

M-转换后删除地图文件

可执行文件必须与映射文件位于同一目录中。这将创建jdbg文件(基于映射文件),插入exe并删除映射。有了这个(还有绝地的异常单位),当出现异常时,我可以使用堆栈跟踪、系统使用的所有dll的版本、操作系统信息等等,还可以将所有这些信息发送到电子邮件


我意识到Embarcadero也有他们bpl的jdbg文件,所以我认为他们也使用JCL工具

你没有抓住重点

映射文件作为一个单独的文件生成,以避免增加可执行文件的大小。试图将该文件作为一种资源嵌入到可执行文件中,这完全是徒劳的

您还没有提到您正在使用的调试框架。但是还有其他方法可以提供调试信息,我建议您参考所使用的调试框架的文档以了解详细信息。我将只提供一些适用于我尝试过的大多数框架的一般概念

  • 如果您对增加的EXE大小感到满意,并且希望在可执行文件中包含调试信息:请不要使用“映射文件”选项。只需启用链接选项即可。(并确保调试框架将使用它。)
  • 大多数调试框架建议编译时启用。这非常重要,因为它使调试框架更容易推断调用堆栈
  • 某些调试框架具有允许猜测缺少的调用堆栈信息的功能。如果启用,您将需要手动忽略任何实际上没有意义的堆栈项
  • 当然,不要忘记,没有调试信息编译的任何单元都不会在最终可执行文件中包含调试信息

否,在链接程序输出后生成映射文件。无法将尚未生成的映射文件作为资源合并到项目中。

@Jerry:什么代码?该问题询问如何向可执行文件添加资源。没有涉及任何代码。它是链接器在生成可执行文件时生成的映射文件。@Jerry:否。您也可以使用brcc或MS rcc从命令行或生成后事件添加它。但即使你要求IDE去做,它仍然不是代码;这是一个编译器指令,它是一个简单的
{$R filename.ext}
@Rodrigo:JEDI能够为您将映射文件嵌入可执行文件,并且是一个调试单元,您可以直接在应用程序中使用它,而无需将其解压缩到磁盘。其他调试工具(如MadExcept和Eureka)也具有相同的功能。使用其中一个比尝试自己滚动要容易得多。@Jerry:添加资源的编译器指令的位置是不相关的。资源由链接进程添加,链接进程在编译器完成其工作后发生。(资源实际上是在链接器完成后添加的,因为它们被添加到最终的可执行文件中;这就是为什么您可以使用brcc手动将它们添加到现有的exe中。)@MartynA完全正确,这就是我的观点。您一定没有看到我在Ken加入后删除的关于编译器指令
{$R…}
的原始注释。不管怎样,我想说的是,我们不知道OP在做什么,应该投入更多的精力来描述问题和已经尝试过的东西,而不是还没有尝试过的东西。我正在使用绝地工具作为调试框架。我不知道调试信息。我在这里进行了测试,但是EXE的大小增加太多,远不止简单地将映射文件大小添加到EXE中。我想我会继续使用地图文件。