Причины ошибки ILINK32:Неразрешенный внешний '__fastcall System::TObject::newInstance(System::TMetaClass *)', на который ссылается XXX.obj?
-
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-файл из этого набора в активный проект, я получаю вышеупомянутую ошибку на этапе компоновки.
Странными вещами, связанными с этой ошибкой, являются:
- Эта ошибка может быть воспроизведена не на каждом компьютере или установке C ++ Builder (я проверил по крайней мере 5 из них).
- Если вы удалите obj-файл и вместо этого добавите соответствующий pas-файл в проект - ошибка исчезнет.
- Но если вы удалите pas-файл и снова включите obj-файл - ошибки не будет.
- Ни один из obj-файлов pas не изменяется в процессе.То есть.если вы удалите этот набор файлов с компьютера и снова перенесете их с первого компьютера (где они были созданы) - у вас по-прежнему не будет ошибки.
- Как только вы выполните эту последовательность на одной конкретной машине (включите / исключите 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() и связана с двоичным файлом?