it-swarm.dev

Fehlendes Trennzeichen in Makefile?

Das folgende Makefile funktioniert nicht und ich bin nicht sicher, was los ist.

CC = gcc
CFLAGS = -Wall -g

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

Demo hat die Hauptfunktion und lib hat eine Reihe von Methoden, die in der Demo verwendet werden.

Ich habe lib das Flag -c hinzugefügt. Wenn ich jedoch make ausführe, erhalte ich:

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

Überprüfen Sie bei Ihrem Update mit dem Fehler, was Sie in der Zeile vor diesen ${CC}-Befehlen haben. Viele make-Programme benötigen ein real tab-Zeichen, bevor die Befehle und Editoren, die zum Beispiel acht Leerzeichen enthalten, diese zerstören. Das ist meistens die Ursache für die "Fehlende Trennzeichen" -Fehler.

Sie können das mit dem folgenden Protokoll sehen. In der Datei befinden sich vier Leerzeichen vor der $(xyzzy):

xyzzy=echo
all:
    $(xyzzy) hello

Wenn ich es schaffe, bekomme ich denselben Fehler wie Sie: 

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

Aber wenn ich es bearbeite und diese vier Leerzeichen in einen Tab verwandle, funktioniert es gut:

pax> make
echo hello
hello

Sie haben auch ein Problem mit der Art und Weise, wie Sie versuchen, die Quelldateien miteinander zu kombinieren.

Ohne ein -c-Flag für gcc wird versucht, aus each dieser Befehle eine separate ausführbare Datei zu erstellen, die fast sicher zu Linker-Fehlern führt. Du wirst etwas wie (einfach) brauchen:

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

oder (etwas komplexer):

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

Das Problem bei der ersten Lösung besteht darin, dass beide Programme unnötig kompiliert werden, auch wenn nur eines davon veraltet ist. Die zweite Lösung ist etwas intelligenter.

36
paxdiablo

Vermissen Sie zufällig ein "Tab" (\t) vor ${CC}

Oft ersetzt mein Editor die Tabulatoren durch Leerzeichen und ich würde diese Meldung erhalten.

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
5
Gui13

lib muss als Bibliothek und nicht als Programm kompiliert werden.

Ändern Sie es in:

main:
    ${CC} ${CFLAGS} main.c lib.o -o main
lib:
    ${CC} ${CFLAGS} lib.c -c -o lib.o
1
Rusty

Gleicher Fehler Wenn ich hier vi verwende, werden Sonderzeichen nicht angezeigt.

Ursache ist einfach: Vor $ {CC} sollte ein TAB stehen, das keine Leerzeichen enthält.

0
Robina Li

Da main von lib abhängt:

demo: lib demo.c

und

${CC} ${CFLAGS} lib.c -c -o lib.o
0
Karoly Horvath

Einrückung war mein Problem.

Mein IDE verwendete ein TAB-Zeichen anstelle von Leerzeichen. Öffnete das Makefile in vim und führte ein :retab hat die Zeile mit 2 Leerzeichen neu eingerückt und das wurde gelöst.