2012-01-10 33 views

risposta

6

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 
+0

Il fatto è che puoi omettere '* .o', se non ce l'hai li – Lol4t0

+0

Le librerie statiche inseriranno il loro codice solo se in realtà è fatto riferimento, quindi non puoi semplicemente omettere tutti i' .o' – bdonlan

+0

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

13

È 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.

+1

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

Problemi correlati