Domanda

Supponiamo che io ho tre C le librerie statiche dicono libColor.a che dipende * libRGB. * Una che a sua volta dipende dalla libPixel.a . La biblioteca libColor.a si dice che dipende da biblioteca libRGB.a in quanto ci sono alcuni riferimenti a libColor.a ad alcuni dei simboli definiti in libRGB.a . Come faccio a combinare tutte le librerie di cui sopra per un nuovo libNewColor.a , che è indipendente?

Indipendente significa che la nuova biblioteca dovrebbe avere tutti i simboli definiti. Così, mentre il collegamento ho solo bisogno di dare -lNewColor . Le dimensioni della nuova biblioteca dovrebbe essere minimo cioè che non deve contenere i simboli in libRGB.a , che non viene utilizzato da libColor.a , ecc Ho provato la mia fortuna utilizzando varie opzioni in ar di comando (utilizzato per creare e aggiornare statici biblioteche / archivi).

È stato utile?

Soluzione

1 / estrarre tutti i file oggetto da ogni libreria (utilizzando ar) e cercare di compilare il codice senza le biblioteche o uno qualsiasi dei file oggetto. Probabilmente otterrete un secchio vuoto assoluto di simboli non definiti. Se si ottiene alcun simboli indefiniti, passare al punto 5.

2 / Afferra il primo e scoprire quale oggetto soddisfa di file che il simbolo (usando nm).

3 / Scrivete quel file oggetto quindi compilare il codice, incluso il nuovo file oggetto. Si otterrà un nuovo elenco di simboli non definiti o, se non c'è nessuno, passare al punto 5.

4 / Andare al passo 2.

5 / Unire tutti i file oggetto nella vostra lista (se presente) in una singola libreria (di nuovo con <=>).

Bang! Ecco qua. Provate a collegare il tuo codice senza uno qualsiasi degli oggetti, ma con la nuova libreria.

L'intera faccenda potrebbe essere relativamente facilmente automatizzato con uno script di shell.

Altri suggerimenti

Una caratteristica poco utilizzata del archiviatore GNU è lo script di archivio, è un'interfaccia semplice ma potente, e può fare esattamente ciò che si vuole, ad esempio se il seguente script si chiama script.ar:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END

Poi si potrebbe invocare ar come segue:

ar -M < script.ar

e si otterrebbe libNewColor.a che contiene tutti i file .o da libColor.a libRGB.a e libPixel.a.

Inoltre è possibile anche aggiungere file .o regolari e con il comando ADDMOD:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END

Inoltre è super facile da generare questi script in Makefiles, così io di solito creo una regola makefile piuttosto generica, per la creazione di archivi che genera in realtà lo script e invoca ar alla sceneggiatura. Qualcosa di simile a questo:

$(OUTARC): $(OBJECTS)
    $(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
    $(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
    $(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)

Anche se, ora che lo guardo mi immagino che non funziona se $ (OGGETTI) è vuoto (cioè se si desidera solo di combinare gli archivi senza l'aggiunta di file oggetto in più), ma lascerò come esercizio per il lettore per risolvere questo problema, se necessario ...: D

Ecco la documentazione per questa funzione:

https://sourceware.org/binutils/docs/binutils/ar-scripts .html # ar-scripts

Una libreria statica, non è molto più di un archivio di alcuni file oggetto (.o). Che cosa si può fare è estrarre tutti gli oggetti nelle due librerie (usando "ar x") e poi usare "ar" per collegarli tra loro in una nuova libreria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top