2012-03-06 30 views
8

El siguiente Makefile no funciona y no estoy seguro de lo que está pasando.¿Falta el separador en Makefile?

CC = gcc 
CFLAGS = -Wall -g 

demo: 
    ${CC} ${CFLAGS} demo.c -o demo 
lib: 
    ${CC} ${CFLAGS} lib.c -o lib 
clean: 
    rm -f lib demo 

Demostración tiene la función principal y lib tiene un conjunto de métodos utilizados en la demostración.

Agregué el distintivo -c a lib. Sin embargo, cuando ejecuto make, me sale:

Makefile:5: *** missing separator. Stop. 
+1

¿Qué quiere decir con "not working"? ¿Qué errores estás obteniendo? ¿Que esta pasando? ¿Qué no está pasando? – Mat

+1

¿Puede mostrarnos el error? – MByD

+0

Lo siento, lo he añadido ahora. – Kobi

Respuesta

30

Dada su actualización con el error, comprobar lo que tiene en la línea antes de que esos ${CC} comandos. Muchos programas make requieren un real carácter de tabulación antes de que los comandos y editores que ponen en ocho espacios (por ejemplo) los rompan. A menudo, eso es la causa de los errores del "separador perdido".

Puede verlo con la siguiente transcripción. En el archivo, hay cuatro espacios antes del $(xyzzy):

xyzzy=echo 
all: 
    $(xyzzy) hello 

lo tanto, cuando lo hago, me sale el mismo error que tú:

pax> make 
makefile:3: *** missing separator. Stop. 

Pero, cuando edito y convertir esos cuatro espacios en una pestaña, que funciona bien:

pax> make 
echo hello 
hello 

también tiene un problema con la forma en que está tratando de com bine los archivos fuente juntos.

Sin una bandera -c a gcc, que tratará de crear un ejecutable independiente de cada de esos comandos, es casi seguro que conduce a errores de enlace. Usted va a necesitar algo así como (simple):

CC = gcc 
CFLAGS = -Wall -g 

# Just compile/link all files in one hit. 
demo: demo.c lib.c 
    ${CC} ${CFLAGS} -o demo demo.c lib.c 

clean: 
    rm -f demo 

o (un poco más compleja):

CC = gcc 
CFLAGS1 = -Wall -g -c 
CFLAGS2 = -g 

# Link the two object files together. 

demo: demo.o lib.o 
    ${CC} ${CFLAGS2} -o demo demo.o lib.o 

# Compile each source file to an object. 

demo.o: demo.c 
    ${CC} ${CFLAGS1} -o demo.o demo.c 

lib.o: lib.c 
    ${CC} ${CFLAGS1} -o lib.o lib.c 

clean: 
    rm -f demo 

El problema con la primera solución es que innecesariamente elabora los dos programas, incluso cuando sólo uno esta fuera de fecha. La segunda solución es un poco más inteligente.

+0

He añadido esto a '.editorconfig': [Makefile] indent_style = pestaña indent_size = 4 – DUzun

+1

@DUzun, suponiendo que el' Makefile' en su comentario es el nombre del archivo, es posible que desee considerar también hacer también para 'makefile' y' * .mk' (junto con cualquier otra variante de archivo make que desee usar). – paxdiablo

1

lib necesita ser compilado como una biblioteca, no un programa.

pruebe a cambiar a:

main: 
    ${CC} ${CFLAGS} main.c lib.o -o main 
lib: 
    ${CC} ${CFLAGS} lib.c -c -o lib.o 
+0

Gracias, pero el problema sigue ahí. Quiero vincular lib a main para que sepa que puede usar las funciones en lib. – Kobi

0

Desde main depende de lib:

demo: lib demo.c 

y

${CC} ${CFLAGS} lib.c -c -o lib.o 
5

Qué echa de menos un poco de "ficha" (\t) antes ${CC} por casualidad?

A menudo, mi editor reemplazará pestañas por espacios y obtendría este mensaje.

CC = gcc 
CFLAGS = -Wall -g 

demo: 
[TAB]${CC} ${CFLAGS} demo.c -o demo 
lib: 
[TAB]${CC} ${CFLAGS} lib.c -o lib 
clean: 
[TAB]rm -f lib demo