Cause dell'errore ILINK32: '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *) esterno non risolto a cui fa riferimento XXX.obj?
-
07-07-2019 - |
Domanda
Ricevo il seguente errore dal linker di C ++ Builder 2009
Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?
Abbiamo una serie di file Delphi ( .pas
) e una serie di file C ++ Builder ( .hpp
e .obj
), che è stato generato da questi file .pas
.
Il set di file viene copiato su un altro computer. Entrambe le macchine hanno la stessa versione C ++ Builder 2009 con gli stessi aggiornamenti (più recenti: 3 + 4) installati.
Quando creo un'applicazione VCL vuota in C ++ Builder su un'altra macchina e includo un file obj da questo set al progetto attivo, ottengo l'errore sopra menzionato nella fase di collegamento.
Le strane cose di questo errore sono:
- Questo errore può essere riprodotto non su tutte le macchine o l'installazione di C ++ Builder (ne ho verificate almeno 5).
- Se rimuovi obj-file e invece aggiungi il file pas corrispondente al progetto, l'errore scompare.
- Ma se rimuovi pas-file e includi di nuovo obj-file - non si verificherà alcun errore.
- Nessuno degli oggetti dei file pas viene modificato nel processo. Cioè se elimini questo set di file dal computer e li porti nuovamente dal primo computer (dove sono stati creati), non avrai ancora alcun errore.
- Dopo aver eseguito quella sequenza su una macchina specifica (includi / escludi il file pas dal progetto) - non puoi più ottenere questo errore su quella macchina, non importa quanto ci provi (sposta i file tra le cartelle, gioca con le impostazioni , ecc., ecc.). In realtà, non ho già macchine, dove posso riprodurre questo errore in questo momento :(
Non vedo come la situazione "dopo" è diverso dalla situazione "prima" (dopo / prima dell'inclusione del file pas), quindi l'errore è visibile solo prima e non dopo.
L'unica menzione di questo errore (o un errore molto simile) su Internet è questo . Ma non c'è soluzione. Non ci sono " + " caratteri nel percorso né negli spazi (" ").
Mi sto perdendo qualcosa? In questo momento mi sembra un bug di C ++ Builder.
P.S. Non possiamo usare " basta includere pas-file " soluzione, poiché è necessario distribuire solo .hpp
e .obj
(nessun file .pas
) su determinate macchine.
Soluzione 3
Va ??bene, ho trovato la risposta: il motivo erano alcune impostazioni dell'IDE o del progetto errate (non lo so per certo).
Ho diverse versioni di C ++ Builders e Delphis installate. E per qualche ragione il linker di C ++ Builder del 2009 ha raccolto file obj errati, quelli che dovrebbero essere usati per un'altra versione (possibile 2007).
Il motivo dell'errore è stato che NewInstance è stato modificato tra le versioni 2007 e 2009 - vedere qui: https://forums.codegear.com/thread.jspa?messageID=161105
Altri suggerimenti
Stavo anche ricevendo questo errore ma era perché l'ho avuto questo definito:
virtual void getMaxSafeSpace();
Invece di:
virtual void getMaxSafeSpace()=0;
nella mia classe astratta.
Sembra che se si crea il progetto dai file pas, una copia della funzione '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)' viene definita da qualche parte, ma non nei file obj, e collegato al binario. Una volta definita la funzione, la trova il file XXX.obj. Quindi, se si eliminano i file obj correnti e si portano i file obj da un'altra macchina, l'errore non viene visualizzato. Questo è solo il mio pensiero. Non conosco Delphi né ho idea di pas file o C ++ Builder.
Il tuo progetto sta creando dll o qualche tipo di librerie esterne in cui la funzione System :: TObject :: NewInstance () è definita e collegata al binario?