2013-03-24 17 views
8



Sto imparando C Programmazione tramite "Apprendi in modo difficile". Sono attualmente (per un periodo di tempo molto lungo) sull'esercizio 2, che può essere trovato qui: http://c.learncodethehardway.org/book/ex2.htmlCompilare qualsiasi programma in C utilizzando solo "make" (da un Makefile)

Nella sezione di credito extra, c'è una sfida che ci chiede di modificare il Makefile in modo che possiamo compilare il file .c (ex1.c) usando solo il comando "make". Questo è ciò che la sfida dice esattamente:

Create an all: ex1 target that will build ex1 with just the command make.

Attraverso cercando here e un sacco di altri posti, questo è il codice credo sia corretto:

CFLAGS="-Wall" -g 

all: ex1 
    CFLAGS="-Wall" -g 

clean: 
    rm -f ex1 

Tuttavia, quando si tenta di eseguire questo, Ricevo il file compilato e continuo a ricevere un errore:

cc "-Wall" -g ex1.c -o ex1 
CFLAGS="-Wall" -g 
/bin/sh: 1: -g: not found 
make: *** [all] Error 127 

Che cosa sta succedendo qui? Qual è la ragione dietro il messaggio di errore? Come posso risolvere questo?

Grazie ragazzi.

+0

Hmm, la rimozione delle virgolette non sembrava fare nulla. Il programma stesso sta compilando, ma sto ricevendo questi strani messaggi di errore su "-g" non trovato. Mi piacerebbe davvero sapere cosa sta causando questo e quindi come posso risolvere il problema. – antigravityguy

risposta

10
  • Se all è il primo obiettivo nel makefile (sto facendo un ipotesi qui dal momento che non ho mostrato tutto il Makefile), fare sceglierebbe che, come il primo obiettivo di costruire, quando si fanno non passare un obiettivo esplicito dalla riga di comando (cioè mera make)

  • ex1 è un pre-requisito per all, quindi si costruisce prima e quindi si vede la seguente riga:

    cc "-Wall" -g ex1.c -o ex1 
    
  • Dopo ex1 è costruito, fanno tentativi per eseguire la ricetta per tutti, dove si esegue il seguente comando:

    CFLAGS="-Wall" -g 
    
  • Da -g di per sé non è un comando valido o applicazione che può essere eseguito nella shell, si ottiene questo errore:

    /bin/sh: 1: -g: not found 
    

Soluzione:

  • Hai già definito CFLAGS all'inizio del makefile, quindi non è necessario definirlo nuovamente nella ricetta.Anche se desideri sostituire la variabile CFLAGS, non dovresti utilizzarla direttamente come parte della ricetta.

  • Definire all e clean come target PHONY, se non lo si è già fatto. L'obiettivo all e clean non crea un file denominato all o clean dopo l'esecuzione della ricetta, quindi è una buona pratica classificare questi obiettivi come PHONY.

  • Non è necessario doppie virgolette -Wall

Il seguente Makefile ha tutte queste correzioni:

CFLAGS = -Wall -g 

all: ex1 

clean: 
    rm -f ex1 

.PHONY: all clean 
+0

Questo ha funzionato bene. Grazie – antigravityguy

4
CFLAGS = -Wall -g 

all: ex1 

clean: 
    rm -f ex1 

dovrebbe essere tutto il necessario dal momento che fanno ha una regola di default built-in per compilare un file .c in un file eseguibile.

L'errore consiste nell'utilizzare un'assegnazione di variabile come comando. La parte con

CFLAGS="-Wall" -g 

tenta di eseguire il comando -g con un'assegnazione di variabili one-shot CFLAGS="-Wall".

+0

Ciao, grazie per la tua risposta. Questo ha senso ora. – antigravityguy

0

vorrei suggerire una regolazione in modo che si può costruire solo ex1 inserendo make, indipendentemente dal fatto che questa sia la prima compilazione o una ricompilazione del codice sorgente.

Fonte:ex1.c

Makefile:

CFLAGS=-Wall -g 

all : clean ex1 

clean: 
    rm -rf ex1 ex1.dSYM 

.PHONY: all clean 

Aggiungendo la clean destinazione fasullo come primo prerequisito per all, esso esegue il comando rm -rf ex1 ex1.dSYM prima dell'esecuzione implicita Comando cc con il prerequisito ex1.

Inoltre, su Mac OS-X usando .PHONY all clean non è necessario per make per eseguire i comandi nel Makefile, tuttavia, è probabilmente buon precedente per impostare in modo che chiunque la lettura del codice in seguito si rende conto che tutti e pulito non sono file di destinazione effettivi.

Oh e un grande grazie a Zed A. Shaw per aver reso Learn the Hard Way libero di leggere sul suo sito Learn C the Hard Way.

Problemi correlati