Delphi-在修复VCL错误时,使用x的其他版本编译了x单元

问题描述 投票:3回答:3

我正在使用Delphi XE6,并在我的项目中使用Datasnap和JSON。我想在VCL单元System.JSON.pas(在TJSONString.ToString函数中)中纠正一个错误,该错误应转义反斜杠字符和引号。为了解决这个问题,我进行了以下操作:

  1. 从标准VCL源文件夹复制到System.JSON.pas至我的项目源文件夹
  2. 将System.JSON.pas添加到我的项目中(使用新复制的文件)
  3. 已修复错误并尝试编译

我收到错误'Unit Data.DBXCommon已使用其他版本的System.JSON.TJSONObject进行编译'

[我可以看到Data.DBXCommon单元引用了System.JSON,所以我想编译器现在看到2个版本-我的固定版本和标准VCL版本。

实现VCL更改以避免此问题的正确方法是什么?

json delphi vcl datasnap
3个回答
2
投票

此问题有两个常见原因:

  1. 您对本机的界面部分进行了更改。您必须先重新编译使用要修改的单元的所有单元,然后才能执行此操作。
  2. 您使用与最初构建单元时不同的编译器选项重新编译该单元。通过确保用于编译您修改的单元的编译器选项与Embarcadero所使用的相同,来解决此问题。通常,Embarcadero使用默认选项进行编译。将它们直接强加在要修改的源文件中,就在文件的最上方。

话虽如此,但使用上面的选项2无法解决关于类似主题的recent question here。在该问题中,仅在XE6下,根本无法重新编译和链接未修改的Classes单元。这让我想知道这种特殊技术是否已经存在。也许甚至不可能。放弃之前,请查看是否可以编译和链接未修改的单元。

更广泛地讲,绕道行驶通常是解决您所面临的此类问题的简便方法。使用绕行而不是重新编译可以使修复程序的管理更加简洁明了。

更新1

我无法获得未修改的System.JSON单元来重新编译和链接。我认为这意味着在另一个问题中提出的问题不仅限于Classes单元。我认为您会发现这是一个棘手的障碍,需要克服,建议您绕行。

更新2

似乎已在XE6中引入的问题,似乎已通过XE7的发行版得以解决。未经修改的System.JSON单元将在XE7中编译和链接。


0
投票

如果Delphi XE6原始的System.JSON.dcu不是用Delphi XE6编译,而是用Delphi的早期版本之一编译的话。

[您声称通过更改源,然后重新编译System.JSON,您使用相同的方法设法在Delphi XE2中实现了修订。因此,我建议您首先在Delphi XE2和Delphi XE6随附的原始System.JSON文件之间进行比较。

如果它们相同,则您设法使用Delphi XE2重新编译的更改后的System.JSON.dcu可能也可以用于Delphi XE6。


0
投票

我通过以下方式解决了类似问题:

  1. 删除不同版本的。dcu文件(即冲突文件)。

  2. 重新生成项目以创建新的.dcu文件。

© www.soinside.com 2019 - 2024. All rights reserved.