Проблема пакета 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).
Другая странность заключается в том, что он ссылается на блоки, которые находятся в зависимости верхнего уровня и являются частью уже построенного пакета.Шаги;
- компилирую, все работает.
- скомпилируйте A_Dsgn, это работает.
- компиляция B, она работает.
- компиляция B_Dsgn, это работает.
- скомпилировать C, и он выдает эту ошибку E2411.
Обновление я попробовал играть с опциями Explicit Rebuild
и Rebuild as Needed
. Я обнаружил, что эта ошибка связана с включением функции "перестроить по мере необходимости". Когда он выключен, пакеты терпят неудачу с другими ошибками, которые являются более существенными. Мне кажется странным, что компилятор выдает странные ошибки, которые можно отключить, выключив Rebuild as needed
. Есть идеи, что происходит?
Обновление 2 основная основная проблема не решается путем включения или выключения явного перестроения. Вместо того, чтобы получить эту ошибку, я получаю раздражающие проблемы runtime / designtime package, которые приводят к набору пакетов, которые не могут быть загружены одновременно. (Не может загрузить пакет foo, потому что он содержит блок bar, который также находится в пакете bat. Вы хотите попробовать загрузить этот пакет следующим время загрузки проекта?).
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
, по крайней мере, мне удалось это сделать.