làm cho phàn nàn về bộ phân tách thiếu (ý của bạn là TAB?)


10

Trong khi cố gắng cài đặt som_pak-3.1-NAcMoS.tar.gztệp, tôi đã sử dụng các lệnh dưới đây:

$ tar xvf som_pak-3.1-NAcMoS.tar.gz
$ cd som_pak-3.1
$ cp makefile.unix makefile
$ make
$ cd ..
$ ln -s som_pak-3.1 $NACMOS_HOME/som_pak

Nhưng trong khi thực hiện makelệnh, tôi nhận được lỗi sau:

* dấu phân cách bị thiếu (ý bạn là TAB thay vì 8 khoảng trắng?). Dừng lại.

  • Bất cứ ai có thể cho tôi biết lý do của lỗi?
  • Có gói nào cần kèm theo không?

1
Bạn đã tải tập tin đó từ đâu?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


15

Lỗi bạn gặp phải:

*** dấu phân cách bị thiếu (ý bạn là TAB thay vì 8 khoảng trắng?). Dừng lại.

Có nghĩa là makefilekhông gian chứa thay vì Tab. Các maketiện ích nổi tiếng là kén chọn về việc sử dụng Spacethay vì Tab. Vì vậy, có khả năng là phần makefilechứa Spaceở phần đầu của khổ thơ quy tắc trong tệp.

Thí dụ

Giả sử tôi có 3 .ctệp sau:

chào c
char *
hello() 
{
  return "Hello";
}
thế giới
char *
world() 
{
  return "world";
}
chính.c :
#include <stdio.h>

/* Prototypes. */
char *hello();
char *world();

int
main(int argc, char *argv[]) 
{
    printf("%s, %s!\n", hello(), world());
    return 0;
}    

Nói rằng tôi có những điều sau đây Makefile:

# The executable 'helloworld' depends on all 3 object files
helloworld: main.o hello.o world.o
        cc -o helloworld main.o hello.o world.o # Line starts with TAB!

# Build main.o (only requires main.c to exist)
main.o: main.c
        cc -c main.c # Line starts with TAB!

# Build hello.o (only requires hello.c to exist)
hello.o: hello.c
        cc -c hello.c # Line starts with TAB!

# Build world.o (only requires world.c to exist)
world.o: world.c
        cc -c world.c # Line starts with TAB!

#  Remove object files, executables (UNIX/Windows), Emacs backup files, 
#+ and core files
clean:
        rm -rf  *.o helloworld *~ *.core core # Line starts with TAB!

Bây giờ chúng tôi cố gắng xây dựng một mục tiêu

Khi tôi chạy nó chống lại mục tiêu helloworld:

$ make helloworld
makefile:3: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.

Nhìn có quen không?

Khắc phục sự cố

Bạn có thể khắc phục điều này bằng cách thay đổi các ký tự Spacesthực tế Tab. Tôi đã sử dụng vimđể sửa chữa tập tin của tôi. Đơn giản chỉ cần mở nó:

$ vim makefile

Và sau đó chạy lệnh này trong:

:%s/^[ ]\+/^I/

LƯU Ý: ^I là một ký tự đặc biệt. Gõ ^theo sau Isẽ được hiểu khác so với Ctrl+ V- Ctrl+ I.

Điều này sẽ thay thế tất cả các dòng bắt đầu bằng 1 hoặc nhiều hơn Spacesvới một thực tế Tab.

Bây giờ khi tôi chạy lại helloworldmục tiêu của mình :

$ make helloworld
cc -c main.c # Line starts with TAB!
cc -c hello.c # Line starts with TAB!
cc -c world.c # Line starts with TAB!
cc -o helloworld main.o hello.o world.o # Line starts with TAB!

Người giới thiệu


Tôi không tìm thấy mẫu lỗi E486 khi tôi cố gắng sử dụng lệnh vim đó
Daniel Jacobson

@DanielJacobson - nếu bạn có Q mới, vui lòng hỏi nó, ý kiến ​​không có nghĩa là đặt câu hỏi mới.
slm

^ Tôi vừa mới tạo ^ Tôi trong chính tệp thay vì tab
Sun

1

Như câu trả lời khác được đề xuất, Makefiles cần các ký tự tab, không phải ký tự khoảng trắng. Tôi có .vimrcthiết lập của mình để tự động thay thế tất cả các tab bằng dấu cách, vì vậy tôi phải đặt thủ công cài đặt ngược trong các Makefiles riêng lẻ. Các vimlệnh mà tôi sử dụng là như sau:

:%s/^[ ]\+/\t/g

Tôi sử dụng modeline này (dòng đầu tiên trong Makefile)# vim: set noet:
Michael D.

0

Lưu ý: Cách chính xác để giải quyết vấn đề cụ thể này là sửa Makefile sao cho mỗi dòng hành động của mỗi công thức được thụt lề bằng một ký tự tab duy nhất và sau đó gửi bản vá cho nhà phát triển ban đầu.

Đây là một hack xấu xí, hoạt động với các phiên bản GNU gần đây make(nếu vấn đề là Makefile sử dụng khoảng trắng thay vì các tab, nhất quán):

make '.RECIPEPREFIX+='

Điều này sẽ đặt makebiến GNU đặc biệt .RECIPEPREFIXthành một không gian duy nhất. Biến này, kể từ GNU make3.82 hoặc hơn (2007), điều khiển ký tự được sử dụng để tiền tố các dòng hành động của công thức nấu ăn. Nếu biến trống (theo mặc định), các tab được sử dụng.

Thí dụ,

$ cat Makefile
all:
  echo hello
$ make '.RECIPEPREFIX+='
echo hello
hello

Ví dụ, hiển thị công dụng của nó với >(đặt biến bên trong Makefile trong trường hợp này):

$ cat Makefile
.RECIPEPREFIX = >
all:
> echo hello
$ make
echo hello
hello

Xem thêm:

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.