Ho un sacco di librerie statiche (* .a), e voglio costruire una libreria condivisa (* .a) per collegarmi a quelle librerie statiche (* .a). Come posso farlo in gcc/g ++? Grazie!Posso creare una libreria condivisa collegando le librerie statiche?
risposta
Non riesco a capire perché non sia possibile creare i file della libreria dinamica in file .o e creare un collegamento;
gcc -shared *.o -lstaticlib1 -lstaticlib2 -o mylib.so
Il fatto è che puoi omettere '* .o', se non ce l'hai li – Lol4t0
Le librerie statiche inseriranno il loro codice solo se in realtà è fatto riferimento, quindi non puoi semplicemente omettere tutti i' .o' – bdonlan
Nota anche che se più istanze della stessa libreria statica sono presenti nello stesso eseguibile (caricate indirettamente tramite librerie condivise contenenti le librerie statiche), possono accadere cose strane – bdonlan
È possibile (solo estrarre tutti i file .o
e collegarli con -shared
per fare un .so
), ma se funziona, e come funziona, dipende dalla piattaforma e se la libreria statica è stata compilata come codice indipendente dalla posizione (PIC). Su alcune piattaforme (ad es. X86_64), il codice non PIC non è valido nelle librerie condivise e non funzionerà (in realtà penso che il linker si rifiuterà di creare lo .so
). Su altre piattaforme, il codice non PIC funzionerà in librerie condivise, ma la copia in memoria della libreria non è condivisibile tra i diversi programmi che la utilizzano o anche le diverse istanze dello stesso programma, quindi provocherà un'enorme quantità di memoria.
Grazie per questa risposta molto utile! Immagino che questa sia la migliore spiegazione per questo errore quando si esegue questa operazione su x86_64: 'non è possibile utilizzare il riposizionamento R_X86_64_32S contro 'g_gGlobalVariable' quando si crea un oggetto condiviso; ricompilare con -fPIC ' – dashesy
.a non è una libreria condivisa. Puoi dare un esempio di ciò che stai cercando di fare? – bdonlan