PDA

View Full Version : [C,C++] Linking libreria


Unrue
05-06-2008, 14:59
Ciao ragazzi,
mi sono imbattuto in un problema di linking sulle librerie SCALAPACK. Dunque, compilando l'applicazione, dopo aver dato ovviamente il link alle librerie, non trovava una particolare funzione che nelle librerie invece c'è. Vi mostro alcuni flag che inserivo inizialmente:

-lblacs -lblacsCinit

Ebbene, ho scoperto che nella prima libreria c'è una chiamata ad una funzione della seconda. E nella seconda c'è una chiamata ad una funzione della prima. Insomma, ci sono due chiamate intrecciate. Allora, per risolvere il problema, ho dovuto ripetere il link alla prima libreria:

-lblacs -lblacsCinit -lblacs

E funziona perfettamente. Mi è stato spiegato che è una cosa normale in questi casi. Il compilatore usato è intel 10.1. Ma a me non torna comunque: una volta specificate le librerie, per quale motivo devo ripeterle? Come si comporta il linker in questi casi? Grazie :)

ilsensine
05-06-2008, 15:40
10 a 1 che sono librerie statiche, vero?

Unrue
05-06-2008, 15:58
10 a 1 che sono librerie statiche, vero?

Si, esatto. Quindi?

ilsensine
06-06-2008, 08:08
Quindi, è normale.
Non sono state fatte proprio bene, quelle librerie. Non deve esserci una mutua dipendenza.
La soluzione che hai usato è un buon workaround, ce ne sono comunque altri.

Unrue
06-06-2008, 10:17
Quindi, è normale.
Non sono state fatte proprio bene, quelle librerie. Non deve esserci una mutua dipendenza.
La soluzione che hai usato è un buon workaround, ce ne sono comunque altri.

Mm, non mi torna..:D Il linker , quando vede le chiamate incrociate, non riesce a capire da solo che si sta richiamando una libreria già indicata. Perché?

Un'altra soluzione quale sarebbe, visto che le hai accennate? Grazie. :)

banryu79
06-06-2008, 10:56
Mm, non mi torna..:D Il linker , quando vede le chiamate incrociate, non riesce a capire da solo che si sta richiamando una libreria già indicata. Perché?

Il motivo potrebbe essere questo?

I was having a conversation with a C guru and he told me that ANSI C standard
doesn't require C compiler to do multiple passes when linking.
Multiple passes mean that the compiler looks at all junk on command line before adding libraries.

Il quote è riferito al C ANSI però il motivo potrebbe essere lo stesso.

ilsensine
06-06-2008, 11:43
Mm, non mi torna..:D Il linker , quando vede le chiamate incrociate, non riesce a capire da solo che si sta richiamando una libreria già indicata. Perché?
Perché le librerie da linkare vengono processate sequenzialmente dal linker. Quando incontra un archivio statico, il linker include solo gli oggetti .o presenti nell'archivio statico che sono richiesti, ovvero che forniscono un simbolo ancora non risolto. Gli altri vengono scartati, per evitare di ingrandire il programma con oggetti non necessari.

Nel tuo caso, nel momento in cui viene processato -lblacs, il simbolo richiesto da blacsCinit non è ancora noto, quindi l'oggetto .o di blacs che lo contiene viene scartato.

Un'altra soluzione quale sarebbe, visto che le hai accennate? Grazie. :)
Forzare il linker a includere tutti gli oggetti dei due archivi statici, oppure trasformare gli archivi statici in librerie dinamiche (.so).
Meglio sarebbe correggere le due librerie in modo da non avere dipendenze incrociate.

Unrue
06-06-2008, 22:38
Perché le librerie da linkare vengono processate sequenzialmente dal linker. Quando incontra un archivio statico, il linker include solo gli oggetti .o presenti nell'archivio statico che sono richiesti, ovvero che forniscono un simbolo ancora non risolto. Gli altri vengono scartati, per evitare di ingrandire il programma con oggetti non necessari.

Nel tuo caso, nel momento in cui viene processato -lblacs, il simbolo richiesto da blacsCinit non è ancora noto, quindi l'oggetto .o di blacs che lo contiene viene scartato.


Forzare il linker a includere tutti gli oggetti dei due archivi statici, oppure trasformare gli archivi statici in librerie dinamiche (.so).
Meglio sarebbe correggere le due librerie in modo da non avere dipendenze incrociate.

Perfetto, grazie;) Ultimissima cosa: che problemi può comportare avere dipendenze incrociate visto che bisogna cercare di evitarle?

ilsensine
09-06-2008, 09:35
Non ci sono particolari problemi tecnici in verità (a parte il fastidio con gli archivi statici in cui sei incappato o altri casi particolari), ma è una cosa che ha poco senso. Due librerie che hanno una mutua dipendenza sono...una unica libreria!