2013-06-05 20 views
197

Đây là makefile của tôi:makefile: 4: *** dấu phân tách bị thiếu. Dừng

all:ll 

ll:ll.c 
    gcc -c -Wall -Werror -02 c.c ll.c -o ll [email protected] $< 

clean : 
    \rm -fr ll 

Khi tôi cố gắng make clean hoặ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ó?

+3

Bạn có thể sử dụng .RECIPEPREFIX để thay đổi cách sử dụng ký tự. Xem: https://www.gnu.org/software/make/manual/html_node/Special-Variables.html#Special-Variables – aseq

+0

Cách này không được đóng dưới dạng trùng lặp ??? Có thể trùng lặp của [Làm lỗi: thiếu dấu tách] (https://stackoverflow.com/questions/920413/make-error-missing-separator) – jww

Trả lời

424

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 được xác định bởi các tab ...... và Không gian 4 không tạo tab, chỉ một tab tạo 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 với^I và kết thúc dòng với $ cả hai đều quan trọng để đảm bảo rằng phụ thuộc nào hết đúng cách 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 được với tiện ích làm cho .....

ví 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 [email protected] $<$ 
## the ^I above means a tab was there before the action part, so this lines 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 

hy vọng điều này sẽ giúp ích !!

+69

"makefile có một 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 được xác định bởi các tab ...... và không gian 4 không thực hiện một tab, chỉ một tab làm cho một tab" điều này đã giúp rất nhiều – oiyio

+4

"mèo - 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, nhìn thấy những gì trông giống như một tab, hoàn toàn mất tích rằng đó là ONE LINE trong toàn bộ tập tin mà sử dụng không gian thay vì một tab cứng. – arinmorf

+0

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 vào 'makefile' từ hướng dẫn và nó không hoạt động. Chỉ sau khi xóa không gian và đặt 'Tab' thay thế! – rzaaeeff

14

Bạn nên luôn viết lệnh sau "tab" chứ không phải khoảng trắng.

Điều này áp dụng cho dòng "gcc" (dòng # 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 ll bằng "rm -fr ll". Chèn các tab trước lệnh này quá

+2

Để rõ ràng, phải có một ký tự TAB cứng là ký tự đầu tiên trong mỗi ký tự 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. – MadScientist

+0

nên tabspace phải bằng 2 hoặc 4? trong /.vimrc đặt tabstop = 2 hoặc 4? –

3

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

-1

Điều này là do tab được thay thế bằng dấu cách. Để tắt tính năng này đi đến

gedit-> Edit-> Preferences-> editor

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

"tab thay thế với không gian"

+12

Ở đâu nó nói anh ta đang sử dụng 'gedit'? – Kusalananda

10

Mở VS Mã , chỉ cần nhấp vào "Không gian: 4" ở góc dưới cùng và thay đổi nó thành tab khi chỉnh sửa Makefile của bạn.

+1

Tôi thậm chí còn không nhận thấy điều đó ở đó - cảm ơn thông tin đó. Trước đây tôi đã sử dụng regex find-replace nhưng điều này đẹp hơn rất nhiều. – Peanut

+0

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

1

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

%-linux: force$ 
^[email protected] [ "$(GCC_VERSION)" = "2.96" ] ; then \$ 
^I^Iecho ===== Generating build tree for legacy [email protected] architecture =====; \$ 
^I^I$(CONFIGURE) $(CWD) [email protected] legacy; \$ 
^Ielse \$ 
^I^Iecho ===== Generating build tree for [email protected] architecture =====; \$ 
^I^I$(CONFIGURE) $(CWD) [email protected]; \$ 
^Ifi$ 
^Icd [email protected];make$ 
Các vấn đề liên quan