Tạo lỗi: thiếu dấu phân cách


Câu trả lời:


364

Như được chỉ ra trong hướng dẫn trực tuyến , nguyên nhân phổ biến nhất cho lỗi đó là các dòng được thụt vào bằng dấu cách khi makemong đợi các ký tự tab.

Chính xác

target: 
\tcmd

\tTAB ở đâu (U + 0009)

Sai lầm

target:
....cmd

trong đó mỗi .đại diện cho một KHÔNG GIAN (U + 0020).


4
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

16

Chỉ dành cho nụ cười và trong trường hợp người khác gặp phải lỗi tương tự:

Tôi đã gặp lỗi "dấu tách phân tách" khét tiếng vì tôi đã gọi một quy tắc xác định hàm là

($eval $(call function,args))

thay vì

$(eval $(call function,args))

tức ($là hơn $(.


Gì? :) Tôi đoán bạn không có 0x20"không gian" ở đó, đúng không?
dùng35443

3
@ user35443 Vị trí của$
smac89

8

Đây là một lỗi cú pháp trong Makefile của bạn. Thật khó để cụ thể hơn thế, mà không nhìn thấy tệp, hoặc phần có liên quan.


5

Đối với tôi, vấn đề là tôi đã có một số # ...bình luận cuối dòng được nhúng trong một define ... endefđịnh nghĩa biến đa dòng. Xóa các bình luận làm cho vấn đề biến mất.


Cảm ơn bạn. Tôi không biết ý kiến ​​trong definechỉ thị được đối xử theo nghĩa đen. Trên thực tế hành vi không được giải thích trong tài liệu . (Để rõ ràng: Việc nhúng một ký hiệu số #trong lệnh không phải là lỗi cú pháp. Nhưng nó không được hiểu là bắt đầu một nhận xét, do đó, việc đó được thừa nhận là dễ bị lỗi.)
ynn

3

Lỗi của tôi là trên một dòng khai báo biến với một phần mở rộng nhiều dòng. Tôi có một dấu cách sau dấu "\" khiến cho việc tiếp tục dòng không hợp lệ.

MY_VAR = \
   val1 \ <-- 0x20 there caused the error.
   val2

1

Trong trường hợp của tôi lỗi gây ra tiếp theo. Tôi đã cố gắng thực hiện các lệnh trên toàn cầu tức là bên ngoài bất kỳ mục tiêu nào.

CẬP NHẬT. Để chạy lệnh trên toàn cầu, người ta phải được hình thành đúng. Ví dụ lệnh

ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME

sẽ trở thành:

$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))

1

Trong trường hợp của tôi, lỗi tương tự đã được gây ra bởi vì dấu hai chấm :bị mất ở cuối như trong staging.deploy:. Vì vậy, lưu ý rằng nó có thể dễ dàng sai cú pháp.


1

Trong trường hợp của tôi, tôi thực sự đã thiếu một tab ở giữa ifeqvà lệnh trên dòng tiếp theo. Không có không gian ở đó để bắt đầu.

ifeq ($(wildcard $DIR_FILE), )
cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

Đáng lẽ phải:

ifeq ($(wildcard $DIR_FILE), )
<tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

Lưu ý <tab>là một ký tự tab thực tế


0

Trong trường hợp của tôi, lỗi này là do thiếu không gian đơn thuần. Tôi đã có điều này nếu khối trong tệp thực hiện của tôi:

if($(METHOD),opt)
CFLAGS=
endif

lẽ ra phải là:

if ($(METHOD),opt)
CFLAGS=
endif

với một không gian sau nếu.



-1

Vì vậy, rõ ràng, tất cả những gì tôi cần là gói "xây dựng thiết yếu", sau đó chạy autoconftrước, tạo ra Makefile.pre.in, sau ./configuređó là gói makehoạt động hoàn hảo ...


-2

Theo mã Makefile đã hoạt động:

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