Causes de l'erreur ILINK32: '__fastcall System :: TObject :: NewInstance externe non résolu (System :: TMetaClass *)' référencé depuis XXX.obj?

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

  •  07-07-2019
  •  | 
  •  

Question

Je reçois l'erreur suivante de l'éditeur de liens de C ++ Builder 2009

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

Nous avons un ensemble de fichiers Delphi ( .pas ) et un ensemble de fichiers C ++ Builder ( .hpp et .obj ), qui a été généré à partir de ces fichiers .pas .

Un ensemble de fichiers est copié sur un autre ordinateur. Les deux machines ont la même version de C ++ Builder 2009 et les mêmes mises à jour (les dernières: 3 + 4) sont installées.

Lorsque je crée une application VCL vide dans C ++ Builder sur une autre machine et inclut un fichier obj de cet ensemble dans le projet actif, l'erreur ci-dessus est mentionnée à l'étape de la liaison.

Les aspects étranges de cette erreur sont les suivants:

  1. Cette erreur ne peut pas être reproduite sur toutes les machines ou installations de C ++ Builder (j'en ai vérifié au moins 5).
  2. Si vous supprimez obj-file et ajoutez à la place le fichier pas correspondant au projet, l'erreur disparaîtra.
  3. Mais si vous supprimez pas-file et incluez à nouveau obj-file, il n'y aura pas d'erreur.
  4. Aucun des fichiers obj of pas n'est modifié au cours du processus. C'est à dire. si vous supprimez cet ensemble de fichiers de la machine et les apportez à nouveau depuis la première machine (où ils ont été créés), vous n'aurez toujours aucune erreur.
  5. Une fois que vous avez exécuté cette séquence sur une machine particulière (inclure / exclure pas-fichier du projet), vous ne pouvez plus obtenir cette erreur sur cette machine, peu importe la difficulté de la tâche (déplacer des fichiers entre les dossiers, jouer avec les paramètres , etc). En fait, je n'ai déjà aucune machine sur laquelle je peux reproduire cette erreur maintenant: (

Je ne vois pas comment se passe la situation " après " est différent de la situation "avant". (après / avant l'inclusion de pas-file), donc l'erreur n'est visible qu'avant et non après.

La seule mention de cette erreur (ou d'une erreur très similaire) sur Internet est this . Mais il n'y a pas de solution. Il n'y a pas de " + " des caractères dans le chemin ni les espaces ("").

Est-ce que je manque quelque chose? Pour le moment, cela ressemble à un bogue de C ++ Builder.

P.S. Nous ne pouvons pas utiliser " simplement inclure pas-file " solution, car nous devons déployer uniquement .hpp et .obj (aucun fichier .pas ) sur certaines machines.

Était-ce utile?

La solution 3

OK, j'ai trouvé la réponse: la raison en était une mauvaise configuration de l'EDI ou du projet (je ne sais pas avec certitude).

J'ai plusieurs versions de C ++ Builders et Delphis installées. Et pour une raison quelconque, l'éditeur de liens 2009 de C ++ Builder a récupéré les mauvais fichiers obj - ceux qui devraient être utilisés pour une autre version (possible 2007).

La raison de l'erreur est que NewInstance a été modifiée entre les versions 2007 et 2009 - voir ici: https://forums.codegear.com/thread.jspa?messageID=161105

Autres conseils

J'avais aussi cette erreur mais c'était parce que j'avais ceci défini:

virtual void getMaxSafeSpace();

Plutôt que:

virtual void getMaxSafeSpace()=0;

dans ma classe abstraite.

On dirait que si vous construisez le projet à partir des fichiers pas, une copie de la fonction '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)' est définie quelque part, mais pas dans les fichiers obj. et lié au binaire. Une fois la fonction définie, le fichier XXX.obj la trouve. Donc, si vous supprimez les fichiers obj actuels et apportez des fichiers obj d'une autre machine, l'erreur ne sera pas vue. Ceci est juste ma pensée. Je ne connais ni Delphi ni aucune idée sur les fichiers pas ou sur C ++ Builder.

Votre projet crée-t-il une dll ou une sorte de bibliothèque externe dans laquelle la fonction System :: TObject :: NewInstance () est définie et liée au binaire?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top