2015-07-15 18 views
6

Sto provando a understand static and shared Libraries.C: Creazione di una libreria statica e collegamento utilizzando un Makefile

Desidero eseguire le seguenti operazioni per creare un makefile che separi la compilazione e il collegamento in modo tale che una libreria statica venga creata e collegata allo nel formare l'eseguibile statico finale.

ho il seguente codice per il Makefile, ma sto ottenendo il seguente errore

Makefile:13: *** missing separator. Stop.

Ma sono anche cercando di capire come in realtà link/creare librerie.

Se eseguo i comandi dopo line 12 nel terminale funzionano, ma non nel makefile.

Inoltre, se si può aiutare a migliorare il codice, lo apprezzerei molto.

+0

possibile duplicato di [Errore di creazione: separatore mancante] (http://stackoverflow.com/questions/920413/make-error-missing-separator) –

+0

Le tre righe 'ar',' ranlib' e 'gcc' sono dovrebbe essere la ricetta per quale target? –

+0

@EtanReisner Sono nuovo in C/makefile e librerie. Immagino per 'myProgram'. Ecco perché ho bisogno di assistenza. Anche la riga dove sto ricevendo errore, non contiene 'tab' – user3337714

risposta

9

Prova questo:

all: myProgram 

myProgram: main.o libmylib.a #libmylib.a is the dependency for the executable 
     gcc -lm -o myProgram main.o -L. -lmylib 

main.o: main.c 
     gcc -O -c main.c main.h 

addSorted.o: addSorted.c addSorted.h 
     gcc -O -c addSorted.c 

freeLinks.o: freeLinks.c freeLinks.h 
     gcc -O -c freeLinks.c 

libmylib.a: addSorted.o freeLinks.o #let's link library files into a static library 
     ar rcs libmylib.a addSorted.o freeLinks.o 

libs: libmylib.a 

clean: 
     rm -f myProgram *.o *.a *.gch #This way is cleaner than your clean 

Questo insieme di regole compila prima tutti i file, quindi rende libreria di destinazione (libmylib.a) e lo utilizza è artefatto di collegare l'eseguibile. Ho anche aggiunto un modulo di destinazione ridondante separato solo per le librerie. Richiesta file:

[email protected]> ls 
addSorted.c addSorted.h freeLinks.c freeLinks.h main.c main.h Makefile 
+0

Quindi le librerie sono create solo da tutti i file, ad eccezione di 'main' ?. E una volta creata la libreria, è collegata a 'myProgram'? Questo aiuta. – user3337714

+0

Anche 'Shared Libraries' avrebbe funzionato allo stesso modo? O devo invocare lo stesso da 'main' – user3337714

+0

@ user3337714 Sì, è così. È anche possibile costruire una libreria separata per ogni file non principale o collegare un gruppo di file in una libreria e un altro gruppo di file in un'altra. Basta creare le librerie nel modo desiderato, unendo i file in base al loro scopo per sostenere la chiarezza della struttura del progetto. – Sergey

5

un makefile non è uno script di shell. È un file di configurazione per un sistema esperto. In particolare un sistema esperto che sa, se lo dici, come creare in modo efficiente i file e le loro dipendenze con un minimo di file rielaborare che non necessitano di da rifare.

Se si guarda la prima regola si ha:

myProgram: main.o addSorted.o freeLinks.o 
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o 

che dice al sistema come fare un file chiamato "myProgram" se decide che ha bisogno di farlo. Le parti dopo i due punti sono file necessari a myProgram. Se non ci sono, oppure fai decidere che non sono aggiornati, make proverà a trovare qualche ricetta che può essere utilizzata per crearli o aggiornarli. Una volta fatto il , eseguire quindi la riga "gcc ..." e presuppone che creerà o aggiornerà myProgram.

Le righe ar e ranlib non corrispondono alla sintassi necessaria per una regola makefile. Dal loro aspetto, sembrano essere una ricetta per fare libmylib.a.Se li mettete in sintassi di make ha bisogno di dire che, si ottiene:

libmylib.a: main.o addSorted.o freeLinks.o 
    ar rcu libmylib.a main.o addSorted.o freeLinks.o 
    ranlib libmylib.a 

myProgram dovrebbe dipendere dalla libreria stessa, piuttosto che le contenuto della libreria, ed è meglio mettere le opzioni della libreria alla fine :

myProgram: libmylib.a 
    gcc -o myProgram libmylib.a -lm 

se ti piace, è possibile utilizzare una proposta per dire gcc ricercare le librerie nella directory corrente:

gcc -L. -o myProgram main.o -lmylib -lm 

Ci sono anche variabili di makefile che possono aiutare, non è necessario ripetere così tanto, così avrei scritto la prima regola come:

myProgram: libmylib.a 
    gcc -L. -o [email protected] -lmylib -lm 

tuttavia, è improbabile che main.o dovrebbe in realtà essere parte di la biblioteca, così:

myProgram: main.o libmylib.a 
    gcc -L. -o [email protected] $< -lmylib -lm 

e la regola libreria come:

libmylib.a: addSorted.o freeLinks.o 
    ar rcu [email protected] $+ 
    ranlib [email protected] 

$ + qui significa "tutti i nomi dei file di dipendenza".

Infine, se si desidera che gcc esegua un eseguibile statico effettivo e non sia semplicemente utilizzare la libreria creata, è necessario passare l'opzione '-static' a gcc.

+0

Puoi spiegarmi anche per la libreria condivisa? – user3337714

+0

Le librerie condivise dipendono molto dal sistema in cui ci si trova. Su x86 o x86_64 linux, è necessario compilare i file oggetto con -fpic, tra le altre cose. Altri sistemi possono variare. – user464502

Problemi correlati