makefile: 4: *** ตัวคั่นขาดหายไป หยุด


473

นี่คือ makefile ของฉัน:

all:ll

ll:ll.c   
  gcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<

clean :
  \rm -fr ll

เมื่อฉันพยายามmake cleanหรือmake makeฉันได้รับข้อผิดพลาดนี้:

:makefile:4: *** missing separator.  Stop.

ฉันจะแก้ไขได้อย่างไร


5
คุณสามารถใช้. RECIPEPREFIX เพื่อเปลี่ยนอักขระที่ใช้ประโยชน์ ดู: gnu.org/software/make/manual/html_node/…
aseq

2
สิ่งนี้ไม่ได้ปิดเหมือนที่ซ้ำกันอย่างไร ซ้ำที่เป็นไปได้ของการทำผิดพลาด: ไม่มีตัวคั่น
jww

ใน mcedit "ตัวเลือก -> ทั่วไป" ทำให้แน่ใจว่า "แท็บครึ่งปลอม" ไม่มี "X" ในวงเล็บเหลี่ยมก่อนตัวเลือกนั้น
Jovan Ružić

คำตอบ:


991

makefile มีความสัมพันธ์ที่โง่มากกับแท็บการกระทำทั้งหมดของทุกกฎจะถูกระบุโดยแท็บ และไม่ช่องว่าง 4 รายการไม่สร้างแท็บเฉพาะแท็บเท่านั้นที่สร้างแท็บ

เพื่อตรวจสอบฉันใช้คำสั่ง cat -e -t -v makefile_name

จะแสดงสถานะของแท็บด้วย^Iและการสิ้นสุดบรรทัดด้วย$ทั้งสองมีความสำคัญเพื่อให้แน่ใจว่าการอ้างอิงจบอย่างถูกต้องและแท็บทำเครื่องหมายการกระทำสำหรับกฎเพื่อให้พวกเขาสามารถระบุได้อย่างง่ายดายเพื่อให้ยูทิลิตี้ make

ตัวอย่าง:

Kaizen ~/so_test $ cat -e -t -v  mk.t
all:ll$      ## here the $ is end of line ...                   
$
ll:ll.c   $
^Igcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<$ 
## the ^I above means a tab was there before the action part, so this line is ok .
 $
clean :$
   \rm -fr ll$
## see here there is no ^I which means , tab is not present .... 
## in this case you need to open the file again and edit/ensure a tab 
## starts the action part

8
"cat -e -t -v makefile_name" เป็นสิ่งที่ดีที่สุด เคย ฉันยังคงจ้องมองที่หน้าจอเมื่อเห็นว่าแท็บดูเหมือนจะหายไปโดยสิ้นเชิงว่าเป็นหนึ่งบรรทัดในไฟล์ทั้งหมดซึ่งใช้ช่องว่างแทนที่จะเป็นแท็บยาก
arinmorf

ขอบคุณมาก! ฉันได้รวบรวมซอร์สโค้ดของโครงการขนาดใหญ่ วางบางบรรทัดลงในmakefileบทช่วยสอนและใช้งานไม่ได้ หลังจากลบช่องว่างและวางTabแทนที่จะทำงาน!
rzaaeeff

เมื่อคัดลอก / วางจาก makefile หนึ่งไปยังอีกที่หนึ่งโดยใช้เอดิเตอร์ vi (หรือ vim) ต้องแน่ใจว่าจะไม่จับเส้น ~ (tilde) โดยไม่ตั้งใจซึ่งบ่งบอกถึงจุดสิ้นสุดของไฟล์ ของจริง ~ ดูเหมือนเครื่องหมาย vi และจะทำให้ตัวคั่น "ขาดหายไป *** หยุด" ความผิดพลาด สิ่งนี้อาจดูเหมือนชัดเจน แต่เมื่อมันเกิดขึ้นโดยไม่ได้ตั้งใจก็ยังไม่ชัดเจน ดูคำอธิบายบล็อกของฉันสำหรับข้อมูลเพิ่มเติม
สกอตต์

3
-vตัวเลือกสำหรับการcatสั่งซ้ำซ้อนที่นี่เพราะ-eวิธีการ-vEและวิธีการ-t -vT
xxks-kkk

2
นี่คืออักขระแท็บถ้าใครบางคนใช้โปรแกรมแก้ไขที่แทนที่แท็บคัดลอกวางจากที่นี่:
Ivan Borshchov

32

ใน VS Code เพียงคลิก "Space: 4" ที่มุมจริงจังและเปลี่ยนเป็นแท็บเมื่อแก้ไข Makefile ของคุณ


1
ฉันไม่ได้สังเกตว่ามี - ขอบคุณสำหรับข้อมูลที่ ก่อนหน้านี้ฉันใช้ regex find-replace แต่มันดีกว่ามาก
ถั่วลิสง

รหัส VS ยอมรับว่าไฟล์ 'common.mk' ของฉันซึ่งแยกจากไฟล์ Makefile 'แบบไม่ต่อท้ายเป็นไฟล์ make และไฮไลต์อย่างถูกต้อง - แต่เริ่มการเยื้องอย่างเงียบ ๆ ด้วยการเว้นวรรคแทนแท็บ
ฟรานซิสนอร์ตัน

ขอบคุณสำหรับความช่วยเหลือ! ฉันไม่ได้สังเกตเห็นอย่างแน่นอนว่ามีการตั้งค่าแท็บที่มุมด้านล่าง
se_brandon

28

คุณควรเขียนคำสั่งหลังTabและไม่เว้นวรรค

สิ่งนี้ใช้กับgccบรรทัด (บรรทัด # 4) ในกรณีของคุณ gccคุณต้องใส่แท็บก่อน

นอกจากนี้ยังแทนที่ด้วย\rm -fr ll rm -fr llแทรกแท็บหน้าคำสั่งนี้ด้วย


3
เพื่อให้ชัดเจนมากจะต้องมีอักขระ TAB แบบแข็งเป็นอักขระตัวแรกในแต่ละบรรทัดสูตรทางตรรกะ หลังจาก TAB คุณสามารถเพิ่มช่องว่างใด ๆ ที่คุณต้องการ
MadScientist

tabspace ควรเท่ากับ 2 หรือ 4 หรือไม่ ใน /.vimrc set tabstop = 2 หรือ 4?
ราหุลเรดดี้

@RahulReddy วิธีที่เครื่องมือแก้ไขแสดงแท็บไม่เกี่ยวข้องกับว่ามีหรือไม่มีอักขระแท็บในการกำหนดค่า
xaxxon

เคล็ดลับที่ดีเพราะฉันมีช่องว่างด้านหน้า เมื่อฉันตรวจสอบมันทำงาน สุดยอด :)
indianwebdevil

9

ทางออกสำหรับPyCharmจะติดตั้งMakefile supportปลั๊กอิน:

  1. เปิดPreferences( cmd + ,)
  2. ไปที่Plugins->Marketplace
  3. ค้นหาMakefile supportติดตั้งและรีสตาร์ท IDE

สิ่งนี้ควรแก้ไขปัญหาและระบุไวยากรณ์สำหรับ makefile


นอกจากนี้ยังช่วยใน GoLand
Vizjerei

ฉันพบเรื่องจริงของ IDE ไม่รองรับรุ่นแท็บใน pycharm เมื่อฉันเปลี่ยนเป็น ATOM อินพุต TAB จะทำงาน
Moonlight Knight

6

เป็นคำถามที่ค่อนข้างเก่า แต่ฉันยังอยากจะพูดถึงอีกหนึ่งตัวเลือกโดยใช้vi/vimเครื่องมือแก้ไขเพื่อแสดงภาพแท็บ ถ้าคุณได้vi/vimติดตั้งแล้วเปิดMakefile(เช่นvim Makefile) :set listและป้อน สิ่งนี้จะแสดงจำนวนแท็บที่แทรกไว้ด้านล่าง

 %-linux: force$
^I@if [ "$(GCC_VERSION)" = "2.96" ] ; then \$
^I^Iecho ===== Generating build tree for legacy $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@ legacy; \$
^Ielse \$
^I^Iecho ===== Generating build tree for $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@; \$
^Ifi$
^Icd build-$@;make$

6

การใช้.editorconfigเพื่อแก้ไขแท็บโดยอัตโนมัติ:

root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4

[Makefile]
indent_style = tab

4

จุดสำคัญคือ "HARD TAB" 1. ตรวจสอบว่าคุณใช้ TAB แทนช่องว่าง 2. ตรวจสอบ. vimrc ของคุณสำหรับ "set tabstop = X"


2

หากทุกคนในคุณกำลังใช้ผลิตภัณฑ์จาก Intellij โซลูชันสำหรับสิ่งนี้คือสิ่งต่อไปนี้:

  1. ไปที่การตั้งค่า> ตัวแก้ไข> สไตล์โค้ด
  2. ที่นี่คุณต้องเลือกประเภทไฟล์ที่เกี่ยวข้องกับปัญหาของคุณ Other File Typesแต่ส่วนใหญ่อาจจะต้องเลือก
  3. ในแท็บที่เปิดให้ทำเครื่องหมายที่ช่องทำเครื่องหมายUse tab characterและระมัดระวังTab sizeและIndentค่าต้องเป็น 4

2

หากคุณใช้ mcedit สำหรับการแก้ไข makefile คุณต้องเห็นเครื่องหมายต่อไปนี้ ป้อนคำอธิบายรูปภาพที่นี่


0

นี่เป็นเพราะแท็บถูกแทนที่ด้วยช่องว่าง หากต้องการปิดใช้งานคุณสมบัตินี้ให้ไปที่

gedit-> Edit-> Preferences-> บรรณาธิการ

และลบการตรวจสอบ

" แทนที่แท็บด้วยช่องว่าง "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.