2009-03-01 9 views
16

Ragazzi, descrivete alcune cose sui blocchi di costruzione C++, su Unix.Creazione di un progetto, da Makefile a librerie statiche/dinamiche in UNIX

Voglio creare un'applicazione che si collega alle librerie statiche e alle librerie dinamiche (.so).

Domanda 1:Come creare una libreria statica utilizzando gcc/g ++? Come faccio a creare il link dell'app contro di esso.

Domanda 2:come specificare nel makefile, che collega contro librerie statiche e dinamiche, partendo dal presupposto che entrambe le librerie sono file di intestazione

Sommario: Sono stato con makefile e librerie per anni, scritto da qualcun altro. Così ogni volta che l'ho modificato, ho semplicemente incollato e incollato le cose in giro, senza comprenderlo veramente. Ora voglio scendere a fondo e comprendere in profondità il processo di costruzione/collegamento/creazione di Makfile.

Che cos'è un buon libro che descrive questi concetti nei dettagli intimi?

Grazie

risposta

15

librerie statiche sono di solito archiviato con il comando ar. Una volta che si costruisce tutti i file oggetto (preferibilmente con l'interruttore -fPIC su GCC), è possibile eseguire ar in questo modo:

ar -rs archivename.a list.o of.o objects.o 

La pagina man descrive le opzioni.

librerie dinamiche sono costruite generalmente con l'interruttore -shared-gcc o ld e il nome del file di output con estensione .so.

Gli Autotools lo gestiscono con il programma libtool. Non ho familiarità con il suo uso.

Linking contro queste librerie può essere fatto sia elencando le librerie con l'interruttore -l (ell) (come -lX per collegare libX.so) oppure specificando direttamente con percorsi assoluti (come l'aggiunta /usr/lib/libX.so al comando). Le librerie statiche sono collegate specificando -static prima del -l o il percorso assoluto appropriato per l'archivio .a.

10

Bare Bones Makefile per la creazione di una libreria statica che consiste del codice in foo.cpp, bar.cpp:

PROJECT = library.a 
OBJECTS = foo.o bar.o 
CFLAGS = -Wall -pedantic 

all: $(PROJECT) 

.cpp.o: 
     g++ -c $(CFLAGS) $< 

$(PROJECT): $(OBJECTS) 
     libtool -o $(PROJECT) -static $(OBJECTS) 

ossa Bare Makefile per un baz.cpp app che i collegamenti statici per library.a:

PROJECT = baz 
CFLAGS = -Wall -pedantic 
OBJECTS = baz.o 

all: $(PROJECT) 

.cpp.o: 
     g++ -c $(CFLAGS) $< 

$(PROJECT): $(OBJECTS) library.a 
     g++ $(OBJECTS) -L. -llibrary -o $(PROJECT) 

La biblioteca dinamica è rimasta, ahem, come un esercizio per il lettore.

+0

Qual è -c in GCC. E il file di intestazione? –

+0

inoltre, $

+0

-c significa compilare ma non collegare. $ <è il nome del file senza estensione. Controlla le pagine man di gcc, make. I file di intestazione non hanno posto in un Makefile, a meno che non siano una dipendenza. –

2

Risposta 1: Per creare una libreria statica dai file di origine foo.c e bar.c, fare questo:

gcc -c foo.c 
gcc -c bar.c 
ar rc mylibrary.a foo.o bar.o 

Per ulteriori informazioni su questo, leggere il GCC manual manuale per imparare ad usare il compilatore e il linker tramite il compilatore. Il binutils manual dovrebbe anche essere essere utile.

Risposta 2: Il GNU Make manual è bello buono. Per conoscere veramente le biblioteche e come funzionano, leggi il manuale Linkers and Loaders di John R. Levine.

Le librerie statiche sono piuttosto semplici, ma le librerie condivise possono essere molto pelose, in base allo sulla piattaforma e alla quantità di portabilità desiderata e necessaria. Ad esempio, su alcuni sistemi di librerie statiche e condivise devono essere compilate con diverse opzioni per funzionare correttamente (uno deve e l'altro non deve essere compilato con codice indipendente dalla posizione indipendente). Intere strutture di utilità sono state sviluppate per semplificare questo (libtool), ma non sono prive di problemi.

0

Poiché si fa riferimento a gcc, presumo che si stia utilizzando GNU Make. La migliore documentazione che ho trovato è official manual, che copre tutto ciò che devi sapere in termini facili da capire.

0

Quando stavo imparando sulla programmazione Linux, Advanced Linux Programming mi ha aiutato molto. È possibile selezionare la sezione Scrittura e utilizzo delle librerie in this pdf. Spiega parecchio sulle librerie in Linux.

+1

Questo è un ottimo libro, ma preferisco qualcosa in combinazione con i makefile. –