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
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.
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
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
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.
13727600cookie-checkFehlendes Trennzeichen im Makefile?yes
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