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.
possibile duplicato di [Errore di creazione: separatore mancante] (http://stackoverflow.com/questions/920413/make-error-missing-separator) –
Le tre righe 'ar',' ranlib' e 'gcc' sono dovrebbe essere la ricetta per quale target? –
@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