Неразрешенный внешний после миграции проекта

#c builder #vcl #unresolved-external

#c builder #vcl #неразрешенный-внешний

Вопрос:

Я использую C Builder 10.4.1. Я перенес простой проект, содержащий 3 формы. Основная форма содержит TDriveComboBox . Когда я пытаюсь скомпилировать, я получаю эти ошибки:

 [ilink32 Error] Error: Unresolved external 'Vcl::Filectrl::TDriveComboBox::' referenced from (then it lists the path to the main form's OBJ file)
[ilink32 Error] Error: Unresolved external '__fastcall Vcl::Filectrl::TDriveComboBox::GetDrive()' referenced from (then it lists the path to the main form's OBJ file)
  

Я даже пытался удалить TDriveComboBox и заменить его, но это не помогает.
В чем проблема и как я могу ее исправить?

Комментарии:

1. Вам не хватает любой библиотеки, содержащей этот элемент управления, из списка библиотек компоновщика. Удаление элемента управления и добавление его обратно не поможет; компоновщику все равно нужно найти библиотеку для разрешения символа, прежде чем вы сможете создать свое приложение.

2. @KenWhite нет, он ничего не упускает… это редкая, но известная проблема с повреждением файла проекта IDE

3. Редко бывает хорошей идеей позволить новой IDE перенести старый проект. Слишком много вещей может пойти не так, ссылки могут быть испорчены и т.д. Обычно лучше всего создать новый проект заново в новой IDE, а затем при необходимости добавить в этот проект существующие исходные файлы.

4. Реми, я действительно выполнил настоящую миграцию проекта.

Ответ №1:

Я бы:

  1. удалите все временные файлы (obj, exe, tds, …)
  2. добавьте новую временную TDriveComboBox форму с этой проблемой
  3. скомпилируйте и запустите.

Если это не помогает, то иногда вручную #include заголовок VCL, содержащий компонент в *.h файле формы, помогает сбросить компилятор / компоновщик, поэтому найдите в папке VCL inc TDriveComboBox в моей системе его здесь:

 c:Program Files (x86)BorlandBDS4.0includevclFileCtrl.hpp
  

Поэтому добавьте что-то вроде:

 #include <FileCtrl.hpp>
  

или

 #include <vcl\FileCtrl.hpp>
  

в ваш *.h файл формы… но даже это иногда терпит неудачу. По моему опыту, проблема заключается в файле проекта ( *.bds, *.bdsproj, ... или любом другом расширении, которое получили более новые версии), поэтому рекомендуется создать его резервную копию, пока компилятор работает должным образом… Поскольку это иногда повреждает само себя, особенно для больших проектов.

Иногда также помогает, если вы перемещаете:

 #pragma hdrstop
  

строка в разные места (на несколько строк вниз или вверх). Если вам повезет, он также может сбросить компилятор / компоновщик, после чего вы можете переместить его в исходное местоположение. Однако это помогает только изредка (например, 1: 20). И вам также нужно попробовать несколько мест

В случае, если ничего не работает, просто создайте новый пустой проект, скопируйте в него формы и прочее и добавьте его в project… Каждая форма содержит 3 файла ( *.h,*.cpp,*.dfm ) и не забудьте добавить в свой проект все, что вам нужно (DLL * .lib, …), если он не связан напрямую со #pragma link всеми пользовательскими материалами 3-го участника, используемыми вашим приложением

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

Комментарии:

1. Спасибо. TDriveComboBox находится в файле Vcl.FileCtrl.hpp в C Builder 10.4.1. Включение #include либо в раздел, управляемый компилятором, файла .h, либо в верхней части файла .cpp работает. Формат, который я использовал, #include <Vcl.FileCtrl.hpp> . Мне не нравится вмешиваться в части файла .h, контролируемые компилятором, поэтому я помещаю его в файл .cpp. Это сработало. Интересно, что добавление другого TDriveComboBox в форму не привело к добавлению строки #include в файл .h .

2. @BobPenoyer структура заголовка VCL генерируется IDE, и иногда она повреждает себя … добавление заголовка вручную в нужное место исправит (но не восстановит), однако файл проекта иногда сбрасывается, но как только происходит что-то подобное, он имеет тенденцию повреждать себя таким же образом снова и снова… По моему опыту, чем больше компонентов VCL у вас есть (тип и номер), тем выше вероятность этой проблемы… Я столкнулся с этим только в 3 моих проектах (за более чем 15 лет кодирования BCB), так что, к счастью, эта ошибка встречается редко…

3. Также, если это решило вашу проблему, вы должны проверить это как принятый ответ. Интересно, что в вашем компиляторе он должен быть в * .cpp … Я использую более старую версию (BDS2006), и работает только размещение в *.h, поэтому могут быть некоторые серьезные изменения в поведении между версиями IDE / compiler

4. Добавление #include <Vcl.FileCtrl.hpp> в файл cpp работает для меня при переходе с BCB 6 на RAD Studio 11.2. Спасибо.

Ответ №2:

Я обнаружил, что большинство из этих проблем, созданных ide при преобразовании моих проектов 10.3.3 в 10.4.1, могут быть решены с помощью раздражающего процесса, как описано ниже:

  1. откройте форму.
  2. на вкладке дизайн переключитесь на текстовый вид.
  3. переключитесь на форму veiw.
  4. в project перекомпилируйте только форму.
  5. теперь запустите project.

Это решило большинство моих нерешенных проблем, кроме _CG_ *.