Il nostro team ha utilizzato Delphi 6 per molti anni, quindi è passato a Delphi 2006 anni fa. Con entrambe le versioni abbiamo il seguente problema: frequentemente il compilatore si lamenta di un'unità che è presumibilmente utilizzata in modo ricorsivo. Questa unità è un'unità LOC 40k che è al centro di un progetto con quasi 1 milione di LOC (terza parte inclusa).Errore di riferimento circolare errato
Il messaggio di errore non è corretto: una compilazione completa sul progetto funziona sempre. Sfortunatamente, il messaggio di errore non ci dice dove si trova il presunto riferimento circolare, solo il nome di quell'unità. A volte capita anche che i messaggi di errore validi siano elencati da 2 a 4 volte finché il problema di riferimento circolare non viene "trovato". Chiaramente il compilatore è in esecuzione in un cerchio qui. A causa delle dimensioni di tale progetto è difficile trovare il problema manualmente. Perciò ho creato uno strumento che dimostra che non esiste realmente un riferimento circolare (lo strumento crea un grafico di dipendenza orientato delle unità e determina i componenti di coerenza in quel grafico - non ce ne sono nessuno eccetto se li inserisco deliberatamente).
Questo non riguarda solo la compilazione F9 ma anche il completamento/approfondimento del codice che non funziona la maggior parte del tempo. A volte funziona quando premo ctrl-space una seconda volta ...
Qualche idea su come possiamo isolare o addirittura risolvere il problema? Si noti che sarà molto difficile suddividere l'unità LOC 40k in unità più piccole perché contiene circa 15 classi di grandi dimensioni che dipendono l'una dall'altra nella sezione dell'interfaccia (so che è male ma dovrebbe funzionare comunque).
Aggiornamento
Siamo costantemente refactoring, ma questo è un'unità difficile da refactoring perché tutto dipende da tutto, o quasi. Abbiamo cercato di aggirarlo tramite le interfacce ma stiamo parlando di alcune classi con 100 di metodi e proprietà. E sarebbe più lento.
L'aggiornamento a D2009 può essere un'opzione in fondo alla strada, ma al momento siamo bloccati con D2006 (la roba unicode e il cartellino del prezzo sono due dei tappi qui). La domanda è comunque se potesse essere d'aiuto dato che il problema è lì fin dal D6 almeno.
Informazioni sul ritaglio delle clausole di utilizzo, lo abbiamo fatto frequentemente con Icarus. Ma questo non ha aiutato finora. Ora ci sono fino a 90 unità personalizzate nella sezione interfaccia. Tuttavia, con un riferimento circolare reale, il problema potrebbe essere in qualsiasi unità. Ho anche provato ad aggiungere tutte le unità al dpr.
Il progetto condivide molto codice con altri progetti e alcuni IFDEF. Tuttavia, le definizioni non sono impostate nelle opzioni del progetto ma tramite un file di inclusione comune. Pertanto tutti i moduli dovrebbero vedere le stesse definizioni. Inoltre, il problema si ripresenta poco dopo una ricostruzione completa senza passare a un altro progetto.
Destro, usiamo dcc32 in uno script di compilazione completo su tutti i progetti (e altro ancora). Non vedo l'ora di usarlo come sostituto per la compilazione di IDE; non sarebbe d'aiuto con l'intuizione del codice e chissà quante volte sarebbe necessario. Ma forse è un modo per diagnosticare il problema? Idealmente, dcc32 incremental si imbatterebbe nello stesso problema e il suo output innesca alcune idee ... –
Sì, questo è esattamente quello che stavo cercando di suggerire, forse non ci sono riuscito a chiarire però :-(Scusa, usando dcc32 dovresti vedi quali file sono compilati più volte, e dopo di che il file si ferma. A meno che il compilatore IDE e il dcc32 siano davvero così diversi, ma questo non lo assumerei – mghie