Проблема пакета Delphi: упакованные единицы должны относиться только к упакованным единицам.. (E2411)


Ошибка, которую я получаю, такова:

[DCC Fatal Error] myunit3.pas(244): E2411 Unit XBAT in package B_Dsgn refers to unit QBEE which is not found in any package. Packaged units must refer only to packaged units

Мне нужно знать, что на самом деле означает эта ошибка, с которой я сталкиваюсь, и, если возможно, как устранить и решить такие проблемы, особенно когда факты, изложенные в сообщении об ошибке, не верны (единицы на самом деле ссылаются на другие единицы в других допустимых пакетах).

Такие проблемы связаны с зависимостями пакетов. У меня возникла интересная проблема с серией из трех связанных пакетов designtime и three runtime вот так:

Введите описание изображения здесь

Самое странное в этом то, что каждый раз, когда я очищаю и перестраиваю, я получаю другое имя блока в ошибке. (Показано выше как единица XBAT относится к единице QBEE).

Другая странность заключается в том, что он ссылается на блоки, которые находятся в зависимости верхнего уровня и являются частью уже построенного пакета.

Шаги;

  1. компилирую, все работает.
  2. скомпилируйте A_Dsgn, это работает.
  3. компиляция B, она работает.
  4. компиляция B_Dsgn, это работает.
  5. скомпилировать C, и он выдает эту ошибку E2411.
Поскольку я сомневаюсь, что кто-то может сказать мне, как именно это исправить, я ищу шаги для устранения сложной проблемы зависимости в пакете. Буквальное значение вышеприведенной ошибки предполагает, например, что у меня должно быть соответствующее сообщение о неявной связанной единице, которой у меня нет. Я добавил Все неявно используемые единицы измерения к базовым пакетам A и B, чтобы не было неявных единиц измерения. делаются предупреждения. Моя следующая идея состояла в том, чтобы отделить выходные папки DCU для каждого пакета, чтобы предотвратить выходы DCU из одного из них от путаницы компилятора. Теперь я даже не могу собрать пакеты.

Обновление я попробовал играть с опциями Explicit Rebuild и Rebuild as Needed. Я обнаружил, что эта ошибка связана с включением функции "перестроить по мере необходимости". Когда он выключен, пакеты терпят неудачу с другими ошибками, которые являются более существенными. Мне кажется странным, что компилятор выдает странные ошибки, которые можно отключить, выключив Rebuild as needed. Есть идеи, что происходит?

Обновление 2 основная основная проблема не решается путем включения или выключения явного перестроения. Вместо того, чтобы получить эту ошибку, я получаю раздражающие проблемы runtime / designtime package, которые приводят к набору пакетов, которые не могут быть загружены одновременно. (Не может загрузить пакет foo, потому что он содержит блок bar, который также находится в пакете bat. Вы хотите попробовать загрузить этот пакет следующим время загрузки проекта?).

3 5

3 ответа:

Я подозреваю, что это неясная ошибка компилятора.

Проект, в котором я его испытывал, имел по крайней мере 4 уровня зависимых пакетов времени выполнения:

PackageA

E2411 единица измерения "%s "в пакете PackageD относится к единице измерения "%s", которая не является нашли в любом пакете. Упакованные единицы должны относиться только к упакованным единицам.

Единственным решением, которое я нашел, было сделать пакеты A, B и C никогда не строящимися (т. е. явными) пакетами и вместо этого используйте зависимости проекта для принудительного выполнения порядка сборки. Я должен был сделать все три never-build или я получу

E2220 Never-build package '%s 'требует всегда-build package' %s '

Я знаю, что это, вероятно, не тот ответ, который вы искали, но вот он.

Кстати, это случилось со мной в Delphi 2009.

Это довольно просто: если единица в C относится к единице, не входящей в пакет, на который ссылается пакет C, эта единица должна быть включена в C, или пакет, в котором она может быть найдена, должен ссылаться на C. Если необходимо, поместите единицу в свой собственный пакет.

Где вы ставите какую единицу зависит от зависимостей. Имеет смысл нарисовать его, как вы это сделали, но с разрешением на уровне единицы измерения.

Обновление

Ваши обновления 1 и обновление 2 все еще заставляют меня думать, что есть единица один из ваших единиц использует (напрямую или косвенно ) то, на что нет правильной ссылки. Возможно, даже блок RTL или VCL. Поскольку у вас есть пакеты проектирования, я предполагаю, что в них есть компоненты.

IME, минимальный набор включаемых пакетов равен

requires
  rtl,
  designide,
  vcl,
  vclactnband,
  vclx,
  xmlrtl;

В проект, который выдает ошибку, необходимо добавить по мере необходимости. ошибка dcp.

В вашем случае:

[DCC фатальная ошибка] myunit3.pas (244): единица E2411 в пакете B_Dsgn XBAT относится к единице QBEE, которая не найдена ни в одном пакете. Должен обратиться моноблочные агрегаты, только моноблочные агрегаты

В пакете, где он myunit3.pas drive, требуется добавить: QBEE

, по крайней мере, мне удалось это сделать.