Fehlendes Trennzeichen im Makefile?

Lesezeit: 4 Minuten

Benutzer-Avatar
Kobi

Das folgende Makefile funktioniert nicht und ich bin mir 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 Demo verwendet werden.

Ich habe das Flag -c zu lib hinzugefügt. Wenn ich jedoch make starte, bekomme ich:

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

  • Was meinst du mit “funktioniert nicht”? Welche Fehler erhalten Sie? Was ist los? Was ist nicht Ereignis?

    – Matte

    6. März 2012 um 9:01 Uhr

  • @Kobi, das liegt mit ziemlicher Sicherheit daran, dass Ihre Befehlszeilen nicht mit einem Tabulatorzeichen beginnen. Siehe meine Antwort für Details.

    – paxdiablo

    6. März 2012 um 9:19 Uhr

Benutzer-Avatar
paxdiablo

Überprüfen Sie angesichts Ihres Updates mit dem Fehler, was Sie vor diesen auf der Leitung haben ${CC} Befehle. Viele make Programme erfordern a real Tabulatorzeichen vor den Befehlen und Editoren, die (zum Beispiel) acht Leerzeichen einfügen, brechen sie. Das ist meistens die Ursache für die Fehler “Fehlendes Trennzeichen”.

Sie können dies anhand des folgenden Transkripts sehen. In der Datei gibt es vier Leerzeichen vor dem $(xyzzy):

xyzzy=echo
all:
    $(xyzzy) hello

Also, wenn ich es mache, bekomme ich den gleichen Fehler wie du:

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 Flagge zu gccwird versucht, eine separate ausführbare Datei zu erstellen jeder dieser Befehle, was mit ziemlicher Sicherheit zu Linker-Fehlern führt. Du wirst etwas brauchen wie (einfach):

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 sie unnötigerweise beide Programme kompiliert, selbst wenn nur eines veraltet ist. Die zweite Lösung ist etwas intelligenter.

  • Ich habe dies hinzugefügt .editorconfig: [Makefile] einzugsstil = tab einzugsgröße = 4

    – Duzun

    4. Februar 2018 um 22:24 Uhr


  • @DUzun, vorausgesetzt, dass die Makefile In Ihrem Kommentar ist der Dateiname, für den Sie möglicherweise auch in Betracht ziehen möchten makefile und *.mk (zusammen mit allen anderen Make-File-Varianten, die Sie verwenden möchten).

    – paxdiablo

    5. Februar 2018 um 0:45 Uhr


  • In meinem Fall wurde ein Tab benötigt.

    – DimiDak

    29. März 2021 um 1:28 Uhr

Vermissen Sie einen “Tab” (\t) Vor ${CC} zufällig?

Oft ersetzt mein Editor Tabulatoren durch Leerzeichen und ich bekomme diese Meldung.

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

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

Die Ursache ist einfach: Es sollte ein TAB und keine Leerzeichen vor ${CC} stehen.

Ich habe das gleiche Problem gelöst, indem ich die führenden Leerzeichen durch Tabulatoren ersetzt habe

lib muss als Bibliothek kompiliert werden, nicht als Programm.

Versuchen Sie, es zu ändern in:

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

  • Danke, aber das Problem ist immer noch da. Ich möchte lib mit main verknüpfen, damit es weiß, dass es die Funktionen in lib verwenden kann.

    – Köbi

    6. März 2012 um 9:07 Uhr

Benutzer-Avatar
Karl Horvath

Seit main kommt drauf an lib:

demo: lib demo.c

und

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

  • Danke, aber das Problem ist immer noch da. Ich möchte lib mit main verknüpfen, damit es weiß, dass es die Funktionen in lib verwenden kann.

    – Köbi

    6. März 2012 um 9:07 Uhr

Benutzer-Avatar
Daniel Andrei Minca

Einrückung war mein Problem.

Meine IDE verwendete ein TAB-Zeichen anstelle von Leerzeichen. Öffnete das Makefile in vim, tat a :retab die Zeile mit 2 Leerzeichen neu eingerückt und das wurde gelöst.

1372760cookie-checkFehlendes Trennzeichen im Makefile?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy