为什么我的单元“使用不同版本”的文件进行编译?

13
我正在构建一个使用插件的程序,但是插件框架的动态链接将RTL和VCL从我的项目EXE中强制分离,并且它们没有启用调试信息。
因此,我建立了一个测试框架,静态链接到我的插件,以便我在跟踪代码时可以实际看到我在做什么。但现在,每次尝试重新编译时,都会出现错误:"unit turbu_skills was compiled with a different version of turbu_database.GDatabase"
我以前见过这个错误,但只有在我改变了RTL或VCL库之类的东西时才会出现。我不明白为什么我的代码会这样做。turbu_skills和turbu_database单位都是我自己编写的单位。 GDatabase是全局单例变量,其类定义已经几周没有更改过了。触发重新编译的任何更改都会导致此错误,即使我没有触摸任何单位中的内容也是如此。
进行完整构建(SHIFT-F9)会使其正确编译。但是,如果我然后在一个单位(任何单位)中按空格并按F9,则会再次出现错误。发生了什么,我该如何停止它?这仅在测试框架中发生,而不在主应用程序中发生。
编辑:我拥有所有单位的源代码。删除DCUs和类似文件没有帮助。将整个项目复制到另一台计算机上,删除所有DCUs并在那里构建也没有帮助。我的程序布局与编译器之间存在客观、可重复的冲突,我想摆脱它。如果有人想测试,可以在http://www.turbu-rpg.com/downloads/Turbu_source_setup.exe找到源代码。它需要使用已安装JVCL的Delphi 2009; 安装程序包会负责其余部分。也许公开源代码将有助于某人追踪此问题。我真的希望如此,因为无论问题在哪里,我都无能为力。问题存在于testing.exe和turbu.groupproj中的turbu.exe中。

编辑2:原来这是另一个跨单元泛型问题。我设法编写了一种解决方法。我只希望他们很快解决这个泛型问题。


2
你可能应该写一个解决方法的答案。这将有助于其他遇到相同问题的人。 - Kenneth Cochran
感谢EDIT 2,但愿我能早几个小时来到这里... - Wodzu
3
@Mason Wheeler - 12个不同的答案!令人惊讶的是有多少人(各种各样)都遇到了与搜索/库路径相关的问题。Embarcadero在解释这个问题上做得非常非常差! - Gabriel
14个回答

19

“unit is compiled with a different version of...”这个错误非常令人头疼。它通常发生在以下情况下:

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

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

你的情况不太清楚。您有一个链接到插件的测试框架。那么X单元和Y单元在哪里适合,您是否认识上面显示的模式?

但是完整构建解决问题的事实表明了问题所在。这已经不是我第一次看到部分重新编译出现问题。因此,我总是使用完整版本。


好的,它不使用符合“unit B”模式且不在测试框架的DPR中的任何文件,尽管“unit B”可能是一个由多个文件组成的依赖链。我会研究一下这个问题。 - Mason Wheeler

5

我讨厌这个问题。我发现它时不时地出现,虽然在你的情况下似乎与插件相关,但我过去曾通过查找并删除我们编写的所有包的dcus、bpls和dcps,然后重新构建包来解决这个问题。


4
我是如何解决Delphi XE7中的“路径疯狂”问题的:
  Rule1: Always separate the DCU from the PAS files

  Tools -> Option -> Library path: 
                 Path to global (3rd party) libraries (DCU folder) that never change.

                    c:\Delphi\Tools\FastMM\
                    c:\MyProjects\Packages\Third party packages\$(Platform)
                    c:\MyProjects\Packages\DragDrop\$(Platform)
                    c:\MyProjects\Packages\Graphics32\$(Platform)

  Project -> Options -> Search path: 
                 Path to personal libraries, that changes often. 
                 Enter the path to the DCU folder first, then path to PAS file. 
                 This way, the compiler will use the DCU files first, instead of recomilin every time from PAS files. 
                 It will recompile anyway if you do a Build.

                    c:\MyProjects\Packages\cCommonControls\$(Platform)_$(Config)
                    c:\MyProjects\Packages\cCommonControls\

  Project -> Options -> Output directory: 
                 Leave it empty so the exe file is generated in project's folder 

  Project -> Options -> DCU output directory: 
                 Use .\$(Platform)_$(Config) in order to enforce Rule1

3

这种情况经常发生在我忘记将DPK Build controlRebuild as needed更改为Explict rebuild时,在选项...|描述中进行。


1

请检查您的源代码目录中是否有旧的、有问题的dcu文件。


1

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


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

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

  2. 搜索路径列表中存在重复文件,并且先找到了错误版本。


很遗憾,不是这样的。这是我检查的第一件事。这个特定的情况最终证明是编译器中的一个故障,在使用泛型时出现了许多错误。我找到了一种解决方法。 - Mason Wheeler

1
在我的情况下,我将“问题”单元的位置添加到了项目的搜索路径中。只要它能找到,就可以编译。当然,如果你有几个版本的相关文件,这可能会使事情变得复杂...

0

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


0
对我来说,问题在于我只安装了 Delphi 的最小必需组件。当我打开一个使用完整 Delphi 安装编译的项目时,就会出现这种情况。将另一台安装了完整 Delphi 的机器上 "Source" 文件夹中的文件复制到 Delphi 安装文件夹中解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接