Причины ошибки ILINK32: Неразрешенная внешняя '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)', на которую ссылается XXX.obj? - PullRequest
4 голосов
/ 14 сентября 2009

Я получаю следующую ошибку от компоновщика 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 ]

1 голос
/ 03 марта 2017

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

virtual void getMaxSafeSpace();

Вместо:

virtual void getMaxSafeSpace()=0;

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

0 голосов
/ 16 сентября 2009

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

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

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

0 голосов
/ 14 сентября 2009

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

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

...