2014-07-25 10 views
5

Ho circa 80 librerie statiche. Vorrei creare una libreria statica da quella.Come usare libtool per creare una libreria statica da un mucchio di librerie statiche

This answer non ha funzionato per me da quando ricevo il seguente errore:.

libtool: unrecognized option `-static' 

Sono anche confuso su modalità di cui deve essere fatto in E ' "link" o "install" Dato che ci sono 20 librerie dispari, posso usare anche "*" per specificare tutto?

Non ho trovato alcuna informazione nel documento previsto this che in realtà non risponde alla mia domanda.

FYI..These sono le modalità:

MODE must be one of the following: 

     clean   remove files from the build directory 
     compile   compile a source file into a libtool object 
     execute   automatically set library path, then run a program 
     finish   complete the installation of libtool libraries 
     install   install libraries or executables 
     link   create a library or an executable 
     uninstall  remove libraries from an installed directory 
+0

Per creare una libreria statica utilizzando 'libtool', tutte quelle 80 librerie statiche devono essere state compilate con' libtool --mode = compile' e non semplicemente 'gcc'. Inoltre, potresti condividere l'output per 'which libtool' e' ls -l ' – askmish

risposta

3

Probabilmente sto ignorando ingenuamente alcune conseguenze, ma non potresti semplicemente trattare i file direttamente come archivi?

for i in *.a; ar x $i; done 
ar r libfoo.a *.o 
ranlib libfoo.a 

Naturalmente, avrete bisogno di un qualche tipo di rinominare schema se uno qualsiasi dei file .o sono gli stessi. Probabilmente qualcosa come libname_objectname.o.

1

La prima risposta collegata è su Mac OS libtool, non libtool GNU.

Il secondo link in realtà potrebbe funzionare (qui avvolto con variabili Makefile), se non ti dispiace scrivere una installazione gancio:

$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(AR) cru "$(DESTDIR)$(libdir)/libsponge.a" libfoo.a libbar.a ... 

Il libtool modalità "link" sembra molto esigente rispetto alla statica librerie. Sono stato in grado di farlo ma mi ha dato degli avvertimenti, uno per ogni libreria statica, che sarebbe stata un'enorme cascata per te.

In questo caso, potrebbe essere più semplice aggirare lo libtool. Questo funziona con GNU ar:

lib_LIBRARIES=libsponge.a 
libsponge.a : libfoo.a libbar.a ... 
     echo "CREATE [email protected]" > libsponge-script 
     list='$^'; for p in $$list; do \ 
      echo "ADDLIB $$p" >> libsponge-script; \ 
     done 
     echo "SAVE" >> libsponge-script 
     $(AR) -M < libsponge-script 
     $(RANLIB) [email protected] 

Se questo deve essere portatile, qualcosa di simile a questo lavoro:

lib_LIBRARIES=libsponge.a 
libsponge.a : libfoo.a libbar.a ... 
     $(AR) cru [email protected] 
     $(MKDIR_P) tmpar 
     list='$^'; for p in $$list; do \ 
      (cd tmpar; $(AR) x "../$$p"; $(AR) q "../[email protected]" *.o; rm *.o;) \ 
     done 
     rm -rf tmpar 
     $(RANLIB) [email protected] 
+0

Grazie, ma l'ultima soluzione non funziona. Ottengo "impossibile leggere i simboli: l'archivio non ha indice, esegui ranlib per aggiungerne uno" anche se ho eseguito ranlib. ar t linspnge.a fornisce una lista di librerie e non di file oggetto che penso sia un problema – Nikhil

+0

Per quanto ne so, devi prima estrarre i file .o e poi creare il nuovo archivio da quelli. I documenti non suggeriscono che estrarrà automaticamente gli oggetti dagli archivi di input. Potrei sbagliarmi comunque. – ams

+0

@Nikhil, quindi stai dicendo che uno dei tuoi file di input '.a' non ha indice? – ldav1s

0

libtool guarda i parametri di gcc, così si dovrebbe avere qualcosa di simile sotto

$ cat Makefile 
all: libone libtwo 
     rm *.o 
     @libtool --mode=link gcc -all-static -o libcombo.a libone.a libtwo.a 

libone: one.c 
     @libtool --mode=compile gcc -c one.c -o one.lo 
     @libtool --mode=link gcc -static -o libone.a one.lo 

libtwo: two.c 
     @libtool --mode=compile gcc -c two.c -o two.lo 
     @libtool --mode=link gcc -static -o libtwo.a two.lo 

clean: 
     rm -rf .libs *.lo *.o *.a 
Problemi correlati