Ik krijg de volgende foutmelding bij het uitvoeren van make
:
Makefile:168: *** missing separator. Stop.
Wat veroorzaakt dit?
Antwoord 1, autoriteit 100%
Zoals aangegeven in de online handleiding, is de De meest voorkomende oorzaak van die fout is dat regels worden ingesprongen met spaties wanneer make
tabtekens verwacht.
Correct
target:
\tcmd
waar \t
TAB is (U+0009
)
Fout
target:
....cmd
waarbij elke .
een SPATIE vertegenwoordigt (U+0020
).
Antwoord 2, autoriteit 5%
Alleen voor de grijns, en voor het geval iemand anders een soortgelijke fout tegenkomt:
Ik kreeg de beruchte fout “ontbrekend scheidingsteken” omdat ik een regel had aangeroepen die een functie definieerde als
($eval $(call function,args))
in plaats van
$(eval $(call function,args))
d.w.z. ($
in plaats van $(
.
Antwoord 3, autoriteit 2%
Dit is een syntaxisfout in uw Makefile. Het is vrij moeilijk om specifieker te zijn dan dat, zonder het bestand zelf of relevante delen daarvan te zien.
Antwoord 4
Voor mij was het probleem dat ik een aantal end-of-line # ...
opmerkingen had ingebed in een define ... endef
meerregelige variabeledefinitie . Door de opmerkingen te verwijderen, verdween het probleem.
Antwoord 5
Mijn fout was op een variabele declaratieregel met een extensie van meerdere regels. Ik heb een volgspatie na de “\” waardoor het een ongeldige voortzetting van de regel werd.
MY_VAR = \
val1 \ <-- 0x20 there caused the error.
val2
6
In mijn geval die de volgende is veroorzaakt. Ik heb geprobeerd de opdrachten wereldwijd te voeren, d.w.z. een doelwit.
UIT UIT. Om het commando te draaien, moet men goed worden gevormd. Bijvoorbeeld commando
ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME
zou worden:
$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))
7
In mijn geval werd deze fout veroorzaakt door het ontbreken van een ruimte. Ik had dit als blok in mijn makefile:
if($(METHOD),opt)
CFLAGS=
endif
die had moeten zijn:
if($(METHOD),opt)
CFLAGS=
endif
Met een spatie na indien.
8
In mijn geval werd dezelfde fout veroorzaakt omdat Colon :
ontbrak aan het einde als in staging.deploy:
. Dus merk op dat het een easy-syntaxisfout kan zijn.
9
Ik had het ontbrekende separatorbestand in makeFiles gegenereerd door QMake. Ik porteerde QT-code naar een ander platform. Ik had geen qmakespec en maak geen set. Hier is de link die ik het antwoord heb gevonden:
https:/Forum.qt.io / Onderwerp / 3783 / ontbrekende scheider-fout-in-makefile / 5
10
Om nog een reden toe te voegen waarom dit kan verschijnen:
$(eval VALUE)
is niet geldig en geeft de foutmelding “ontbrekend scheidingsteken”.
$(eval IDENTIFIER=VALUE)
is acceptabel. Dit soort fouten deed zich voor toen ik een macro had gedefinieerd met define
en probeerde te doen
define SOME_MACRO
... some expression ...
endef
VAR=$(eval $(call SOME_MACRO,arg))
waar de macro niet is geëvolueerd naar een opdracht.
Antwoord 11
De volgende Makefile-code werkte:
obj-m = hello.o
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Antwoord 12
Dus blijkbaar was alles wat ik nodig had het “build-essential” pakket, en vervolgens om eerst autoconf
uit te voeren, wat de Makefile.pre.in
maakte, en vervolgens de ./configure
dan de make
die perfect werkt…