为什么我的单位“使用不同版本编译”我自己的文件?

时间:2009-01-09 19:01:06

标签: delphi compiler-construction delphi-2009 delphi-units

我正在构建一个使用插件的程序。不幸的是,插件框架的动态链接迫使RTL和VCL退出我的项目EXE并进入BPL版本,并且它们没有启用调试信息。

所以我构建了一个静态链接到我的插件的测试框架,这样我就可以在跟踪代码时看到我正在做的事情。但是现在,每次我尝试重新编译时,都会出现错误:“unit turbu_skills是用不同版本的turbu_database.GDatabase编译的”

我以前见过这个错误,但只有当我一直在改变我可能不应该做的事情时,比如RTL或VCL库。我不明白为什么用我自己的代码做这件事。 turbu_skills和turbu_database单元都是我自己编写的单元。 GDatabase是一个全局单例变量,其类定义我几周没有改变。触发重新编译的任何更改都会导致此错误,即使我没有触及任何一个单元中的任何内容。

执行完整版本(SHIFT-F9)会使其正确编译。但是,如果我在一个单位(任何单位)中按 SPACE 并按F9,我会再次收到错误。发生了什么,我该如何阻止它?这不会发生在主应用程序中,只会发生在测试框架中。

编辑:我有我所有单位的来源。删除DCU和类似文件没有帮助。将整个项目复制到另一台计算机,删除所有DCU,并在那里构建没有帮助。我的程序布局和编译器之间存在客观的,可重现的冲突,我想摆脱它。

如果有人想测试,可以在http://www.turbu-rpg.com/downloads/Turbu_source_setup.exe找到来源。它需要已安装JVCL的Delphi 2009;安装程序包将负责其余部分。也许拥有源代码可以帮助某人跟踪它。我当然希望如此,因为无论问题出在哪里,它都超越了我。问题可以在testing.exe和turbu.groupproj中的turbu.exe中找到。

编辑2:原来这是另一个跨单位泛型问题。格儿。我设法编写了一个解决方法。我希望他们很快就能解决仿制药问题。

14 个答案:

答案 0 :(得分:17)

错误“单元是用不同版本的......编译的”是一个令人讨厌的错误。它发生在如下情况:

     +--------+
     | unit A |
     +--------+
      |      |
      |      |
      V      |
  +--------+ |
  | unit B | |
  +--------+ |
      |      |
      |      |
      V      V
     +--------+
     | unit C |
     +--------+

单元A和B都使用单元C,单元B使用C.单元B和C被编译,并且由于某种原因单元B的源不可用。现在更换单元C(任何更改都会进行并重新编译)并且单元C的dcu与单元B使用的单元C不同,因此单元B也需要重新编译。但不幸的是,源代码不可用,因此编译器放弃了。

目前还不完全清楚你的情况有什么问题。

您有一个链接到插件的测试框架。那么单位X和Y在哪里适合并且您是否认识到上面显示的模式?

但完整构建解决问题的事实暗示了这个方向。这不是我第一次看到部分重新编译的问题。所以我总是使用完整版本。

答案 1 :(得分:5)

我讨厌这个问题。我发现它时不时会弹出来,虽然听起来与您使用插件的内容直接相关,但我过去通过查找和删除软件包的所有dcus,bpls和dcps解决了这个问题。我们写了然后重建包。

答案 2 :(得分:4)

我如何解决了疯狂的道路问题。在Delphi XE7中:

String s=kbReader.nextLine();
if (s.equalsIgnoreCase("0") { // hopefully no one is named zero :)
  break;
}
String at=s.substring(0,1); ...

答案 3 :(得分:3)

当我忘记在中将构建控件重新构建更改为重写时,我经常会发生这种情况。选项... |描述

答案 4 :(得分:1)

检查源目录中某处是否存在紧张的旧dcu文件。

答案 5 :(得分:1)

  1. 您的实际.dpr文件包含对.pas文件的错误版本的引用。

    查看>项目经理>展开树并检查所有单元的路径。

  2. 搜索路径列表中有一个重复的文件,并且首先找到了错误的版本

答案 6 :(得分:1)

为了将来参考,只需将编译器指向“问题单元”的源代码版本即可为我修复此问题(即将包含源代码的文件夹添加到搜索路径中)。

答案 7 :(得分:1)

绝对是编译器的错误。我发现改变uses子句中单位的顺序将允许你进入“一个免费编译”。之后,错误重新发生,你重新开始重建。 :-(

答案 8 :(得分:1)

就我而言,我将“问题”单位的位置添加到项目的搜索路径中。只要它能找到它,它就会编译。当然,如果您有相关文件的多个版本,可能会使问题复杂化......

答案 9 :(得分:1)

单位ppParameter是使用不同版本的ppRelatv编译的。 TppRelative:

删除程序文件夹/计算机中的所有.dcu,然后重新编译或重新构建。 然后你的程序将再次运行良好。

答案 10 :(得分:0)

您使用的是经过修改的VCL吗?您在界面部分中引用的单位也决定了您的界面。我建议您确保没有可能从您的项目中引用的任何具有相同名称(包括VCL / RTL)的单元的两个不同版本。也许这是一个愚蠢的事情,因为后台编译使用的是不同版本的单元,然后是磁盘编译。所以编辑它会触发后台编译器,后者会混淆同步。

答案 11 :(得分:0)

对我来说问题是我用最少的必需组件安装了Delphi。当我打开一个用完整的Delphi安装编译的项目时,它发生在我身上。使用完整的Delphi安装从另一台机器处理Delphi安装文件夹中“Source”文件夹中的文件解决了我的问题。

答案 12 :(得分:0)

我的案例和解决方案:

  • 我们有一个构建exe文件和
  • 的主应用程序
  • 为此exe构建dll文件的一些插件项目 (dll项目还需要一些应用程序源文件)

有时在编译dll文件时“发生了不同版本的编译”问题

问题在于:

  • exe项目设置为在单独的目录中创建所有的dcu文件:例如App\DCUs
  • dll项目在搜索路径中有这个DCU目录,但也有一些应用程序的源目录:例如App\UtilsApp\Core
  • 因此,当您编译dll项目时,会再次编译一些应用程序源文件(现在可能使用其他依赖项的不同版本):
    我们最终得到了2个不同的*.pas文件
  • 的dcu

解决方案很简单:从dll项目的搜索路径中删除App\DCUs目录。

答案 13 :(得分:0)

我在Delphi XE中遇到了同样的错误信息。关闭Delphi后再次打开它并重新编译我的项目,解决了我的问题。