makefile: 4: *** pemisah yang hilang. Berhenti


476

Ini makefile saya:

all:ll

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

clean :
  \rm -fr ll

Ketika saya mencoba make cleanatau make make, saya mendapatkan kesalahan ini:

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

Bagaimana saya bisa memperbaikinya?


6
Anda dapat menggunakan .RECIPEPREFIX untuk mengubah karakter yang digunakan. Lihat: gnu.org/software/make/manual/html_node/…
aseq

2
Bagaimana ini tidak ditutup sebagai duplikat ??? Kemungkinan duplikat dari kesalahan Buat: pemisah yang hilang
jww

Di mcedit "Opsi -> Umum" buat shure bahwa "Setengah tab palsu" tidak memiliki "X" dalam tanda kurung sebelum opsi itu.
Jovan Ružić

Jawaban:


994

makefile memiliki hubungan yang sangat bodoh dengan tab, semua tindakan dari setiap aturan diidentifikasi oleh tab. Dan tidak, 4 spasi tidak membuat tab, hanya tab yang membuat tab.

untuk mengecek saya menggunakan perintah cat -e -t -v makefile_name

Ini menunjukkan keberadaan tab dengan ^Idan akhiran baris dengan $keduanya sangat penting untuk memastikan bahwa dependensi berakhir dengan benar dan tab menandai tindakan untuk aturan sehingga mereka mudah diidentifikasi ke utilitas make.

Contoh:

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" adalah yang terbaik. Pernah. Saya terus menatap layar, melihat apa yang tampak seperti tab, benar-benar hilang bahwa itu adalah SATU GARIS di seluruh file yang menggunakan spasi alih-alih tab yang keras.
arinmorf

Terima kasih banyak! Saya telah menyusun kode sumber proyek besar. Disisipkan beberapa baris ke dalam makefiledari tutorial, dan itu tidak berhasil. Hanya setelah menghapus spasi dan menempatkan Tabbukan berhasil!
rzaaeeff

Ketika menyalin / menempel dari satu makefile ke makefile lain menggunakan editor vi (atau vim) pastikan untuk tidak secara tidak sengaja mengambil baris ~ (tilde) yang mengindikasikan akhir file. A ~ nyata tampak seperti penanda vi dan akan menyebabkan "pemisah yang hilang. Berhenti." kesalahan. Ini mungkin tampak jelas tetapi ketika itu terjadi secara tidak sengaja, itu jauh dari bukti. Lihat komentar blog saya untuk informasi lebih lanjut.
Scott

3
-vopsi untuk catperintah adalah berlebihan di sini karena -esarana -vEdan -tsarana -vT.
xxks-kkk

2
Berikut adalah karakter tab jika seseorang menggunakan editor yang menggantikan tab, salin tempel dari sini:.
Ivan Borshchov

32

Pada VS Code, cukup klik "Spasi: 4" di sudut kanan dan ubah ke tab saat mengedit Makefile Anda.


1
Saya bahkan tidak menyadarinya - terima kasih untuk informasinya. Saya sebelumnya menggunakan regex find-replace tetapi ini jauh lebih baik.
Kacang

VS Code mengakui bahwa file 'common.mk' saya, diekstraksi dari 'Makefile' tanpa akhiran adalah file make, dan menyorotnya dengan benar - tetapi diam-diam mulai membuat indentasi dengan spasi alih-alih tab.
Francis Norton

Terima kasih untuk bantuannya! Saya jelas tidak memperhatikan ada pengaturan tab di sudut bawah itu.
se_brandon

28

Anda harus selalu menulis perintah setelah Tabspasi dan bukan spasi.

Ini berlaku untuk gccbaris (baris # 4) dalam kasus Anda. Anda harus memasukkan tab sebelumnya gcc.

Ganti juga \rm -fr lldengan rm -fr ll. Sisipkan tab sebelum perintah ini juga.


3
Agar sangat jelas, harus ada karakter TAB keras sebagai karakter pertama di setiap baris resep logis. Setelah TAB, Anda dapat menambahkan ruang kosong apa pun yang Anda inginkan.
MadScientist

haruskah tabspace sama dengan 2 atau 4? di /.vimrc set tabstop = 2 atau 4?
Rahul Reddy

@RahulReddy bagaimana editor menampilkan tab tidak ada hubungannya dengan apakah ada atau tidak karakter tab dalam konfigurasi.
xaxxon

Tip yang bagus, karena saya memiliki ruang di depan. Ketika saya memeriksa itu berhasil. Hebat :)
indianwebdevil

9

Solusi untuk PyCharmmenginstal Makefile supportplugin:

  1. Buka Preferences( cmd + ,)
  2. Pergi ke Plugins->Marketplace
  3. Cari Makefile support, instal, dan mulai ulang IDE.

Ini harus memperbaiki masalah dan menyediakan sintaks untuk makefile.


Ini juga membantu di GoLand
Vizjerei

Saya menemukan hal-hal nyata IDE. Edisi tab tidak didukung di pycharm. Ketika saya beralih ke ATOM, input TAB berfungsi.
Moonlight Knight

6

Ini pertanyaan yang cukup lama tetapi saya masih ingin mengatakan tentang satu opsi lagi menggunakan vi/vimeditor untuk memvisualisasikan tab. Jika Anda telah vi/vimmenginstal maka buka Makefile(misalnya vim Makefile) dan masukkan :set list. Ini akan menunjukkan jumlah tab yang dimasukkan seperti di bawah ini,

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

Menggunakan .editorconfiguntuk memperbaiki tab secara otomatis:

root = true

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

[Makefile]
indent_style = tab

4

Poin kuncinya adalah "HARD TAB" 1. Periksa apakah Anda menggunakan TAB daripada spasi 2. Periksa .vimrc Anda untuk "set tabstop = X"


2

Jika ada di antara Anda yang menggunakan produk dari Intellij, solusinya adalah sebagai berikut:

  1. Buka Preferensi> Editor> Gaya Kode
  2. di sini Anda perlu memilih jenis file yang terkait dengan masalah Anda. Tetapi kemungkinan besar Anda harus memilih Other File Types.
  3. Pada tab yang terbuka tandai kotak centang untuk Use tab characterdan berhati-hatilah, Tab sizedan Indentnilainya harus 4.

2

Jika Anda menggunakan mcedit untuk mengedit makefile. Anda harus melihat tanda berikut. masukkan deskripsi gambar di sini


0

Ini karena tab diganti dengan spasi. Untuk menonaktifkan fitur ini, buka

gedit-> edit-> preferensi-> editor

dan hapus centang untuk

" ganti tab dengan spasi "

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.