12

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

所以我构建了一个静态链接到我的插件的测试框架,这样我就可以在跟踪代码时实际看到我在做什么。但是现在,每次我尝试重新编译时,都会出现错误:“unit turbu_skills was compiled with a different version of turbu_database.GDatabase”

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

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

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

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

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

4

14 回答 14

18

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

     +--------+
     | 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 适合在哪里,您是否识别出上面显示的模式?

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

于 2009-01-09T19:52:35.360 回答
5

我讨厌这个问题。我发现它时不时会弹出,尽管在您的情况下听起来与您使用插件所做的事情直接相关,但我过去通过查找和删除软件包的所有 dcus、bpls 和 dcps 解决了这个问题我们已经编写然后重建包。

于 2009-01-12T00:49:55.087 回答
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
于 2015-10-19T18:54:06.313 回答
3

当我忘记根据需要将 DPK Build控件Rebuild更改为在Options...|Description中显式重建时,这种情况经常发生在我身上。

于 2013-09-02T21:35:03.947 回答
1

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

于 2009-09-21T00:10:22.020 回答
1

检查您在源目录中的某处没有紧张的旧 dcu 文件。

于 2009-01-10T11:06:36.793 回答
1

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

于 2012-02-02T21:08:01.837 回答
1
  1. 您的实际 .dpr 文件包含对不正确版本的 .pas 文件的引用。

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

  2. 搜索路径列表中有重复文件,先找到不正确的版本

于 2009-05-28T00:13:56.733 回答
0

编译器肯定有问题。我发现在 uses 子句中更改单元的顺序将允许您获得“一次免费编译”。之后,错误再次发生,您将重新进行重建。:-(

于 2009-12-18T06:29:15.777 回答
0

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

于 2009-01-12T17:05:34.557 回答
0

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

于 2011-01-04T08:00:57.950 回答
0

Unit ppParameter 是使用不同版本的 ppRelatv 编译的。Tpp相对:

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

于 2013-09-02T19:04:14.577 回答
0

我的案例和解决方案:

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

有时在编译 dll 文件时会出现“使用不同版本编译”的问题

问题是这样的:

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

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

于 2015-01-13T18:30:39.943 回答
0

我刚刚在 Delphi XE 中收到了相同的错误消息。关闭Delphi,再次打开并重新编译我的项目后,我的问题就解决了。

于 2017-03-06T09:21:40.893 回答