Delphi - Модуль x был скомпилирован с другой версией x при исправлении ошибки VCL
Я использую Delphi XE6 и использую Datasnap и JSON в своем проекте. Есть ошибка, которую я хочу исправить в модуле VCL System.JSON.pas (в функции TJSONString.ToString), где он должен экранировать символы обратной косой черты, а также кавычки. Чтобы это исправить, я выполнил следующее:
- Скопировал System.JSON.pas из стандартной исходной папки VCL в исходную папку моего проекта
- Добавлен System.JSON.pas в мой проект (с использованием недавно скопированного файла)
- Исправил ошибку и попытался скомпилировать
Я получаю сообщение об ошибке "Модуль Data.DBXCommon был скомпилирован с другой версией System.JSON.TJSONObject"
Я вижу, что модуль Data.DBXCommon ссылается на System.JSON, поэтому я предполагаю, что компилятор теперь видит 2 версии - мою фиксированную версию и стандартную версию VCL.
Как правильно реализовать изменения VCL, чтобы избежать этой проблемы?
2 ответа
Есть две распространенные причины этой проблемы:
- Вы внесли изменения в интерфейс раздела устройства. Вы не можете сделать это без повторной компиляции всех модулей, которые используют модуль, который вы модифицируете.
- Вы перекомпилируете модуль с параметрами компилятора, отличными от тех, которые использовались для его создания. Сделайте это, убедившись, что параметры компилятора, используемые для компиляции изменяемого вами модуля, такие же, как и в Embarcadero. Обычно Embarcadero компилируется с параметрами по умолчанию. Добавьте их непосредственно в изменяемый исходный файл, прямо в самом верху файла.
Сказав это, недавний вопрос здесь на похожую тему не может быть решен с использованием варианта 2 выше. В этом вопросе, только под XE6, неизмененным Classes
модуль не может быть перекомпилирован и связан вообще. Что заставляет меня задуматься, был ли у этой конкретной техники свой день. Возможно, это даже невозможно. Прежде чем сдаться, посмотрите, сможете ли вы скомпилировать и связать неизмененный модуль.
В более широком смысле, использование обходного пути, как правило, является более простым способом решения таких проблем, с которыми вы сталкиваетесь. Использование обходного пути вместо перекомпиляции делает управление исправлением чище и проще.
Обновление 1
Я не могу получить неизмененным System.JSON
блок для повторной компиляции и ссылки. Что, я думаю, означает, что проблема, поднятая в этом другом вопросе, шире, чем просто Classes
Блок. Я думаю, что вы найдете это сложное препятствие для преодоления и порекомендуете использовать объезд.
Обновление 2
Проблема, которая, кажется, была введена в XE6, кажется, была решена выпуском XE7. Немодифицированный System.JSON
модуль скомпилирует и скомпонует в XE7.
Что если Delphi XE6 оригинальный System.JSON.dcu не был скомпилирован с Delphi XE6, но был скомпилирован с одной из предыдущих версий Delphi.
Вы утверждаете, что вам удалось реализовать свое исправление в Delphi XE2, используя тот же подход, изменив исходный код и затем перекомпилировав System.JSON. Поэтому я предлагаю вам сначала сравнить исходные файлы System.JSON, которые поставляются с Delphi XE2 и Delphi XE6.
Если они совпадают, то измененный System.JSON.dcu, который вам удалось перекомпилировать с Delphi XE2, может также работать с Delphi XE6.
Я решил аналогичную проблему:
Удаление файлов .dcu разных версий (т.е. конфликтующих файлов).
Перекомпилируйте проект, чтобы создать новые файлы.dcu.