Почему мои модули «скомпилированы с другой версией» моих собственных файлов? - 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 ]

0 голосов
/ 06 марта 2017

У меня просто такое же сообщение об ошибке в Delphi XE. Моя была решена после закрытия Delphi, его открытия и повторной компиляции моего проекта.

0 голосов
/ 13 января 2015

мой случай и решение:

  • у нас было основное приложение, которое создает исполняемый файл и
  • некоторые проекты плагинов, которые создают файлы DLL для этого exe
    (проекту dll также нужны некоторые исходные файлы приложений)

иногда при компиляции dll-файлов возникала проблема "был скомпилирован с другой версией"

проблема была в следующем:

  • Проект exe был настроен на создание всех его файлов dcu в отдельном каталоге: например, App\DCUs
  • В проекте dll этот каталог DCU содержался в пути поиска, но также были и некоторые исходные каталоги приложения: например, App\Utils, App\Core и т. Д.
  • Таким образом, когда вы компилировали проект dll, некоторые исходные файлы приложений были скомпилированы снова (теперь возможно с другой версией других зависимостей):
    и у нас получилось 2 разных dcu одного и того же *.pas файла

решение простое: удалите каталог App\DCUs из пути поиска проекта dll.

0 голосов
/ 04 января 2011

Для меня проблема заключалась в том, что я установил Delphi с минимально необходимыми компонентами. И когда я открыл проект, который был скомпилирован с полной установкой Delphi, это случилось со мной. Копирование файлов из папки «Source» в папке установки Delphi с другого компьютера с полной установкой Delphi решило мою проблему.

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

Вы используете модифицированный VCL? Единицы, на которые вы ссылаетесь в разделе интерфейса, также определяют ваш интерфейс. Я бы посоветовал убедиться, что у вас нет двух разных версий ваших устройств с одинаковым именем (включая VCL / RTL), на которые можно ссылаться из вашего проекта. Может быть, это что-то глупое, так как фоновая компиляция использует другую версию модулей, чем дисковая компиляция. Поэтому его редактирование запускает фоновый компилятор, который затем портит синхронизацию.

...