makefile: 4: *** thiếu dấu phân cách. Dừng lại


474

Đây là tệp thực hiện của tôi:

all:ll

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

clean :
  \rm -fr ll

Khi tôi cố gắng make cleanhoặc make make, tôi nhận được lỗi này:

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

Làm thế nào tôi có thể sửa chữa nó?


6
Bạn có thể sử dụng .RECIPEPREFIX để thay đổi cách sử dụng ký tự. Xem: gnu.org/software/make/manual/html_node/ Kẻ
aseq

2
Làm thế nào điều này không được đóng lại như là một bản sao ??? Bản sao có thể có của Lỗi tạo: dấu phân cách bị thiếu
jww

Trong mcedit "Tùy chọn -> Chung", hãy đảm bảo rằng "Các tab nửa giả" không có "X" trong ngoặc vuông trước tùy chọn đó.
Jovan Ružić

Câu trả lời:


992

makefile có mối quan hệ rất ngu ngốc với các tab, tất cả các hành động của mọi quy tắc đều được xác định bởi các tab. Và không, 4 khoảng trắng không tạo một tab, chỉ một tab tạo một tab.

để kiểm tra tôi sử dụng lệnh cat -e -t -v makefile_name

Nó cho thấy sự hiện diện của các tab có ^Ivà kết thúc dòng với $cả hai đều rất quan trọng để đảm bảo rằng các phụ thuộc kết thúc đúng và các tab đánh dấu hành động cho các quy tắc để chúng có thể dễ dàng nhận dạng đối với tiện ích tạo.

Thí dụ:

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" là điều tốt nhất. Không bao giờ. Tôi cứ nhìn chằm chằm vào màn hình, thấy thứ trông giống như một tab, hoàn toàn thiếu rằng đó là MỘT LINE trong toàn bộ tệp sử dụng khoảng trắng thay vì tab cứng.
arinmorf

Cảm ơn bạn rất nhiều! Tôi đã biên dịch mã nguồn của dự án lớn. Dán một số dòng makefiletừ hướng dẫn, và nó không hoạt động. Chỉ sau khi xóa không gian và Tabthay vào đó làm việc!
rzaaeeff 8/8/2015

Khi sao chép / dán từ tệp tạo tệp này sang tệp khác bằng trình chỉnh sửa vi (hoặc vim), đảm bảo không vô tình lấy dòng ~ (dấu ngã) biểu thị phần cuối của tệp. Một thực ~ trông giống như một điểm đánh dấu vi và sẽ gây ra "*** dấu phân cách bị thiếu. Dừng lại." lỗi. Điều này có vẻ hiển nhiên nhưng khi nó vô tình xảy ra thì nó không rõ ràng. Xem bình luận blog của tôi để biết thêm thông tin.
Scott

3
-vtùy chọn cho catlệnh là dư thừa ở đây vì -ephương tiện -vE-tphương tiện -vT.
xxks-kkk

2
Đây là ký tự tab nếu ai đó sử dụng trình chỉnh sửa thay thế các tab, sao chép dán từ đây :.
Ivan Borshchov

32

Trên VS Code, chỉ cần nhấp vào "Space: 4" ở góc dưới và thay đổi nó thành tab khi chỉnh sửa Makefile của bạn.


1
Tôi thậm chí không nhận thấy rằng ở dưới đó - cảm ơn vì thông tin đó. Trước đây tôi đã sử dụng một regex find-thay thế nhưng điều này đẹp hơn rất nhiều.
Đậu phộng

Mã VS nhận ra rằng tệp 'common.mk' của tôi, được trích xuất từ ​​một 'Makefile' không có hậu tố là một tệp tạo và đánh dấu nó một cách chính xác - nhưng lặng lẽ bắt đầu thụt vào khoảng trắng thay vì các tab.
Francis Norton

Cảm ơn đã giúp đỡ! Tôi chắc chắn đã không nhận thấy có một cài đặt tab ở góc dưới cùng.
se_brandon

28

Bạn nên luôn luôn viết lệnh sau một Tabvà không phải khoảng trắng.

Điều này áp dụng cho gccdòng (dòng số 4) trong trường hợp của bạn. Bạn cần chèn tab trước gcc.

Cũng thay thế \rm -fr llbằng rm -fr ll. Chèn các tab trước lệnh này quá.


3
Để rất rõ ràng, phải có một ký tự TAB cứng là ký tự đầu tiên trong mỗi dòng công thức logic. Sau TAB, bạn có thể thêm bất kỳ loại khoảng trắng nào bạn muốn.
MadSellectist

không gian tab nên bằng 2 hoặc 4? trong /.vimrc đặt tabstop = 2 hoặc 4?
Rahul Reddy

@RahulReddy làm thế nào một trình soạn thảo hiển thị một tab không liên quan gì đến việc có hay không một ký tự tab trong cấu hình.
xaxxon

Mẹo tuyệt vời, bởi vì tôi đã có không gian ở phía trước. Khi tôi kiểm tra nó hoạt động. Tuyệt vời :)
Ấn Độwebdevil

9

Giải pháp cho PyCharmviệc cài đặt Makefile supportplugin:

  1. Mở Preferences( cmd + ,)
  2. Chuyển đến Plugins->Marketplace
  3. Tìm kiếm Makefile support, cài đặt và khởi động lại IDE.

Điều này sẽ khắc phục vấn đề và cung cấp một cú pháp cho một tệp thực hiện.


Điều này cũng giúp trong GoLand
Vizjerei

Tôi thấy IDE thực sự quan trọng. Phiên bản Tab không được hỗ trợ trong pycharm. Khi tôi thay đổi thành ATOM, đầu vào TAB hoạt động.
Hiệp sĩ ánh trăng

6

Câu hỏi khá cũ nhưng tôi vẫn muốn nói về một tùy chọn nữa bằng cách sử dụng vi/vimtrình chỉnh sửa để trực quan hóa các tab. Nếu bạn đã vi/vimcài đặt thì mở một Makefile(ví dụ vim Makefile) và nhập :set list. Điều này sẽ hiển thị số lượng các tab được chèn như dưới đây,

 %-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

Sử dụng .editorconfigđể sửa các tab tự động:

root = true

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

[Makefile]
indent_style = tab

4

Điểm mấu chốt là "HARD TAB" 1. Kiểm tra xem bạn đã sử dụng TAB thay vì khoảng trắng 2. Kiểm tra .vimrc của bạn để biết "set tabstop = X"


2

Nếu bất cứ ai trong số bạn đang sử dụng một sản phẩm từ Intellij, giải pháp cho vấn đề này là:

  1. Chuyển đến Tùy chọn> Trình chỉnh sửa> Kiểu mã
  2. Ở đây bạn cần chọn loại tệp liên quan đến vấn đề của bạn. Nhưng có lẽ bạn cần phải chọn Other File Types.
  3. Trong tab đã mở, đánh dấu hộp kiểm cho Use tab charactervà cẩn thận, Tab sizeIndentcác giá trị phải là 4.

2

Nếu bạn đang sử dụng mcedit để chỉnh sửa makefile. bạn phải xem dấu hiệu sau nhập mô tả hình ảnh ở đây


0

Điều này là do tab được thay thế bởi khoảng trắng. Để tắt tính năng này, hãy đi đến

gedit-> chỉnh sửa-> tùy chọn-> biên tập

và loại bỏ kiểm tra cho

" thay thế tab bằng không gian "

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.