Abbiamo una base di codice suddivisa in librerie statiche. Sfortunatamente, le librerie hanno dipendenze circolari; ad esempio, libfoo.a
dipende da libbar.a
e viceversa.Risoluzione delle dipendenze circolari collegando due volte la stessa libreria?
So che il modo "corretto" per gestire questa situazione è quello di utilizzare --start-group
e --end-group
opzioni del linker, in questo modo:
g++ -o myApp -Wl,--start-group -lfoo -lbar -Wl,--end-group
Ma nelle nostre Makefiles esistenti, il problema è in genere gestito in questo modo:
g++ -o myApp -lfoo -lbar -lfoo
(Immaginate questo esteso a ~ 20 biblioteche con complesse interdipendenze.)
vado attraverso ou r Makefile che cambiano la seconda forma alla prima, ma ora i miei colleghi mi chiedono perché ... E a parte "perché è più pulito" e un vago senso che l'altra forma sia rischiosa, non ho una buona risposta.
Quindi, è possibile collegare la stessa libreria più volte sempre creare un problema? Ad esempio, il collegamento potrebbe fallire con simboli definiti in modo multiplo se lo stesso .o viene inserito due volte? O c'è qualche rischio di finire con due copie dello stesso oggetto statico, creando bug sottili?
Fondamentalmente, desidero sapere se esiste la possibilità di errori di collegamento o di runtime per collegare più volte la stessa libreria; e se è così, come attivarli. Grazie.
L'unico problema a cui riesco a pensare è quando riesci a collegarti con due diverse versioni della stessa libreria. È difficile da fare e (IMO) è improbabile che si verifichi su Linux. Inoltre, solo 20 librerie non sembrano molto. Vale la pena camminare attraverso i makefile? Potresti passare quel tempo a fare qualcos'altro. – SigTerm
Questo problema scompare solo se si correggono le librerie in modo da non avere dipendenze circolari. –
Suppongo che rimuovere le dipendenze circolari esaminando e suddividendo le librerie non sia fattibile? Perché sarebbe il modo più pulito –