ฉันได้รับข้อผิดพลาดต่อไปนี้ทำงานmake
:
Makefile:168: *** missing separator. Stop.
อะไรทำให้เกิดสิ่งนี้
ฉันได้รับข้อผิดพลาดต่อไปนี้ทำงานmake
:
Makefile:168: *** missing separator. Stop.
อะไรทำให้เกิดสิ่งนี้
คำตอบ:
ดังที่ระบุไว้ในคู่มือออนไลน์สาเหตุที่พบบ่อยที่สุดสำหรับข้อผิดพลาดนั้นคือบรรทัดจะเยื้องกับช่องว่างเมื่อmake
คาดว่าอักขระแท็บ
target:
\tcmd
\t
TAB อยู่ที่ไหน(U + 0009)
target:
....cmd
โดยที่แต่ละอัน.
แทน SPACE (U + 0020)
เพียงเพื่อรอยยิ้มและในกรณีที่คนอื่นพบข้อผิดพลาดที่คล้ายกัน:
ฉันได้รับข้อผิดพลาด "ตัวแยกขาดหายไป" ที่น่าอับอายเพราะฉันได้เรียกใช้กฎที่กำหนดฟังก์ชันเป็น
($eval $(call function,args))
ค่อนข้างมากกว่า
$(eval $(call function,args))
คือมากกว่า($
$(
0x20
"ที่ว่าง" นั่นถูกต้องไหม
$
นี่เป็นข้อผิดพลาดทางไวยากรณ์ใน Makefile ของคุณ มันค่อนข้างยากที่จะเจาะจงมากกว่านั้นโดยไม่เห็นไฟล์เองหรือส่วนที่เกี่ยวข้อง
สำหรับฉันปัญหาคือว่าฉันมี# ...
ความคิดเห็นในตอนท้ายที่ฝังอยู่ภายในdefine ... endef
นิยามตัวแปรหลายบรรทัด การลบความคิดเห็นทำให้ปัญหาหายไป
define
คำสั่งจะได้รับการปฏิบัติอย่างแท้จริง จริงๆแล้วพฤติกรรมจะไม่ได้อธิบายในเอกสาร (เพื่อความชัดเจน: ฝังสัญญาณจำนวน#
. ภายในสั่งไม่ได้เป็นตัวเองไวยากรณ์ผิดพลาด แต่มันก็เป็นเพียงไม่ตีความว่าเป็นจุดเริ่มต้นของความคิดเห็นเพื่อให้การทำที่เป็นที่ยอมรับผิดพลาดได้ง่าย.)
ข้อผิดพลาดของฉันอยู่บนบรรทัดประกาศตัวแปรที่มีนามสกุลหลายบรรทัด ฉันมีช่องว่างต่อท้ายหลังจาก "\" ซึ่งทำให้ความต่อเนื่องของบรรทัดไม่ถูกต้อง
MY_VAR = \
val1 \ <-- 0x20 there caused the error.
val2
ในกรณีของฉันเกิดข้อผิดพลาดต่อไป ฉันพยายามรันคำสั่งทั่วโลกเช่นอยู่นอกเป้าหมายใด ๆ
UPD ในการรันคำสั่งแบบโกลบอลต้องมีการสร้าง ตัวอย่างคำสั่ง
ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME
จะกลายเป็น:
$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))
ในกรณีของข้อผิดพลาดเดียวกันที่เกิดเพราะลำไส้ใหญ่ที่ขาดหายไปในตอนท้ายในขณะที่:
staging.deploy:
ดังนั้นโปรดทราบว่าอาจเป็นความผิดพลาดทางไวยากรณ์ที่ง่าย
ในกรณีของฉันฉันจริง ๆ แล้วไม่มีแท็บในระหว่างifeq
และคำสั่งในบรรทัดถัดไป ไม่มีช่องว่างที่นั่นเพื่อเริ่มต้นด้วย
ifeq ($(wildcard $DIR_FILE), )
cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif
ควรได้รับ:
ifeq ($(wildcard $DIR_FILE), )
<tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif
หมายเหตุ: <tab>
เป็นอักขระแท็บจริง
ในกรณีของฉันข้อผิดพลาดนี้เกิดจากการขาดพื้นที่เพียง ฉันมีสิ่งนี้ถ้าบล็อกใน makefile ของฉัน:
if($(METHOD),opt)
CFLAGS=
endif
ซึ่งควรจะได้รับ:
if ($(METHOD),opt)
CFLAGS=
endif
ด้วยช่องว่างหลังจากถ้า
ฉันมีไฟล์ตัวคั่นหายไปใน Makefiles ที่สร้างโดย qmake ฉันกำลังย้ายรหัส Qt ไปยังแพลตฟอร์มอื่น ฉันไม่ได้ตั้ง QMAKESPEC หรือทำการตั้งค่า นี่คือลิงค์ที่ฉันพบคำตอบ:
https://forum.qt.io/topic/3783/missing-separator-error-in-makefile/5
เห็นได้ชัดว่าสิ่งที่ฉันต้องการคือแพคเกจ "จำเป็นต่อการสร้าง" จากนั้นเรียกใช้autoconf
ก่อนซึ่งทำMakefile.pre.in
แล้ว./configure
จึงmake
ทำงานได้อย่างสมบูรณ์แบบ ...
รหัส Makefile ต่อไปนี้ทำงาน:
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