Причины ошибки ILINK32:Неразрешенный внешний '__fastcall System::TObject::newInstance(System::TMetaClass *)', на который ссылается XXX.obj?

StackOverflow https://stackoverflow.com/questions/1420515

  •  07-07-2019
  •  | 
  •  

Вопрос

Я получаю следующую ошибку от компоновщика C ++ Builder 2009

Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?

У нас есть набор файлов Delphi (.pas) и набор файлов C ++ Builder (.hpp и .obj), который был сгенерирован из этих .pas Файлы.

Набор файлов копируется на другой компьютер.Обе машины имеют одну и ту же версию C ++ Builder 2009 с одинаковыми обновлениями (последними:3+4) установлен.

Когда я создаю пустое приложение VCL в C ++ Builder на другом компьютере и включаю один obj-файл из этого набора в активный проект, я получаю вышеупомянутую ошибку на этапе компоновки.

Странными вещами, связанными с этой ошибкой, являются:

  1. Эта ошибка может быть воспроизведена не на каждом компьютере или установке C ++ Builder (я проверил по крайней мере 5 из них).
  2. Если вы удалите obj-файл и вместо этого добавите соответствующий pas-файл в проект - ошибка исчезнет.
  3. Но если вы удалите pas-файл и снова включите obj-файл - ошибки не будет.
  4. Ни один из obj-файлов pas не изменяется в процессе.То есть.если вы удалите этот набор файлов с компьютера и снова перенесете их с первого компьютера (где они были созданы) - у вас по-прежнему не будет ошибки.
  5. Как только вы выполните эту последовательность на одной конкретной машине (включите / исключите pas-файл из проекта) - вы больше не сможете получить эту ошибку на этой машине, как бы вы ни старались (перемещать файлы между папками, играть с настройками и т.д. и т.п.).На самом деле, у меня уже нет машин, где я мог бы воспроизвести эту ошибку прямо сейчас: (

Я не вижу, чем ситуация "после" отличается от ситуации "до" (после / перед включением pas-файла), поэтому ошибка видна только до, а не после.

Единственное упоминание об этой ошибке (или очень похожей ошибке) в Интернете - это это.Но решения нет.В пути нет ни символов "+", ни пробелов (" ").

Я что-то упускаю?Прямо сейчас для меня это выглядит как ошибка C ++ Builder.

P.S.Мы не можем использовать решение "просто включить pas-файл", так как нам нужно развернуть только .hpp и .obj (нет .pas файлы) на определенные компьютеры.

Это было полезно?

Решение 3

Хорошо, я нашел ответ:причиной были какие-то неправильные настройки IDE или проекта (я не знаю наверняка).

У меня установлено несколько версий C ++ Builders и Delphis.И по какой-то причине компоновщик C ++ Builder 2009 подобрал неправильные obj-файлы - те, которые следует использовать для другой версии (возможно, 2007).

Причиной ошибки было то, что newInstance был изменен между версиями 2007 и 2009 - смотрите здесь: https://forums.codegear.com/thread.jspa?messageID=161105

Другие советы

Я также получал эту ошибку, но это было потому, что у меня было это определено:

virtual void getMaxSafeSpace();

Вместо того , чтобы:

virtual void getMaxSafeSpace()=0;

в моем абстрактном классе.

Похоже, что если вы создаете проект из файлов pas, то копия функции ‘__fastcall System::TObject::newInstance(System::TMetaClass *)’ где-то определяется, но не в obj-файлах, и связана с двоичным файлом.Как только функция определена, файл XXX.obj находит ее.Таким образом, если вы удалите текущие obj-файлы и перенесете obj-файлы с другого компьютера, ошибка не будет видна.Это всего лишь моя мысль.Я не знаю Delphi и не имею ни малейшего представления о pas-файлах или C ++ Builder.

Ваш проект создает dll или какие-то внешние библиотеки, где определена функция System::TObject::newInstance() и связана с двоичным файлом?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top