Почему мои модули «скомпилированы с другой версией» моих собственных файлов? - PullRequest
11 голосов
/ 09 января 2009

Я создаю программу, которая использует плагины. К сожалению, динамическое связывание инфраструктуры плагинов вытесняет 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 , если кто-то захочет его протестировать. Требуется Delphi 2009 с уже установленной JVCL; Пакет установщика позаботится обо всем остальном. Возможно, наличие исходного кода поможет кому-то отследить это. Я, конечно, на это надеюсь, потому что, где бы ни была проблема, это вне меня. Проблема может быть найдена в test.exe, а также в turbu.exe в turbu.groupproj.

РЕДАКТИРОВАТЬ 2: Оказывается, это была еще одна проблема дженериков между единицами. Grr. Мне удалось закодировать обходной путь. Я просто надеюсь, что они скоро исправят проблемы с дженериками.

Ответы [ 14 ]

17 голосов
/ 09 января 2009

Ошибка «модуль скомпилирован с другой версией ...» раздражает. Это происходит в ситуации, как показано ниже:

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

Оба блока A и B используют блок C, а блок B использует C. Блок B и C скомпилированы, и по какой-то причине источник блока B недоступен. Теперь блок C изменяется (любое изменение будет выполняться и перекомпилируется). И dcu блока C отличается от блока C, используемого блоком B, поэтому блок B также необходимо перекомпилировать. Но, к сожалению, источник недоступен, поэтому компилятор сдается.

Не совсем понятно, что не так с вашей ситуацией.

У вас есть тестовая структура, которая ссылается на плагины. Итак, куда вписываются единицы X и Y и узнаете ли вы схему, показанную выше?

Но тот факт, что полная сборка решает проблему, является намеком в этом направлении. И это не первый раз, когда я вижу проблемы с частичной перекомпиляцией. Поэтому я всегда использую полную версию.

5 голосов
/ 12 января 2009

Я ненавижу эту проблему. Я нахожу, что это всплывает время от времени, и хотя в вашем случае звучит прямая связь с тем, что вы делаете с плагинами, в прошлом я решил эту проблему, найдя и удалив все dcus, bpls и dcps из пакетов. что мы написали, а затем перестраиваем пакеты.

4 голосов
/ 19 октября 2015

Как я решил «путь безумия» в 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 голосов
/ 03 сентября 2013

Это случается со мной очень часто, когда я забываю изменить DPK Управление сборкой с Перестроить при необходимости на Явное восстановление в Опции .. . |. Описание 1009 *

1 голос
/ 02 сентября 2013

Модуль ppParameter был скомпилирован с другой версией ppRelatv. TppRelative:

Удалите все .dcu в папке вашей программы / на вашем компьютере, затем пересоберите или заново соберите. Тогда ваша программа снова будет работать нормально.

1 голос
/ 03 февраля 2012

В моем случае я добавил расположение «проблемных» единиц в путь поиска моего проекта. Пока это могло найти это, это собрано. Конечно, если у вас есть несколько версий рассматриваемого файла, это может осложнить ситуацию ...

1 голос
/ 18 декабря 2009

Определенно что-то глючит с компилятором. Я обнаружил, что изменение порядка модулей в предложении использования позволит вам получить «одну бесплатную компиляцию». После этого ошибка повторяется, и вы возвращаетесь к восстановлению. :-(

1 голос
/ 21 сентября 2009

Для дальнейшего использования просто указание компилятору версий исходного кода «проблемных единиц» исправило это для меня (то есть добавление папок с исходным кодом в путь поиска).

1 голос
/ 28 мая 2009
  1. Ваш фактический файл .dpr содержит ссылку на неправильную версию файла .pas.

    Вид> Диспетчер проектов> разверните дерево и изучите путь всех подразделений.

  2. В списке путей поиска есть дубликат файла, и сначала найдена неверная версия

1 голос
/ 10 января 2009

Убедитесь, что у вас нет старого файла dcu в исходном каталоге.

...