makefile: 4: *** eksik ayırıcı. Dur


474

Bu benim makyajım:

all:ll

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

clean :
  \rm -fr ll

Ne zaman denemek için, make cleanveya make makebu hatayı alıyorum:

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

Nasıl düzeltebilirim?


6
Kullanılan karakterleri değiştirmek için .RECIPEPREFIX kullanabilirsiniz. Bakınız: gnu.org/software/make/manual/html_node/…
aseq

2
Bu nasıl bir kopya olarak kapatılmadı ??? Make hatasının
jww

"Seçenekler -> Genel" mcedit içinde "Sahte yarım sekmeler" bu seçeneği önce köşeli parantez içinde "X" olmadığından emin olun.
Jovan Ružić

Yanıtlar:


991

makefile'in sekmelerle çok aptalca bir ilişkisi vardır, her kuralın tüm eylemleri sekmelerle tanımlanır. Ve hayır, 4 boşluk sekme oluşturmaz, sadece sekme sekme oluşturur.

Komutu kullandığımı kontrol etmek için cat -e -t -v makefile_name

Bağımlılıkların düzgün bir şekilde sona ermesini sağlamak için sekmelerin ^Ive $her ikisinin de satır sonlarının varlığını gösterir ve sekmeler kurallar için eylemi marka oluşturma aracı tarafından kolayca tanımlanabilecek şekilde işaretler.

Misal:

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" en iyi şeydir. Hiç. Ekrana bakıp sekmeye neye benzediğini görmeye devam ettim, sabit bir sekme yerine boşluk kullanan tüm dosyada TEK HAT olduğunu tamamen kaybettim.
arinmorf

Çok teşekkür ederim! Büyük projenin kaynak kodunu derliyorum. makefileÖğreticiden bazı satırlar yapıştırdı ve işe yaramadı. Sadece boşlukları sildikten ve Tabyerine koyduktan sonra çalıştı!
rzaaeeff

Vi (veya vim) düzenleyicisini kullanarak bir makefile'dan diğerine kopyalama / yapıştırma yaparken, yanlışlıkla dosyanın sonunu belirten ~ (tilde) satırını tutmamaya dikkat edin. Gerçek ~ bir vi işaretine benziyor ve "*** eksik ayırıcı. Dur." hata. Bu açık gibi görünebilir, ancak yanlışlıkla gerçekleştiğinde açık değildir. Daha fazla bilgi için blog yorumuma bakın .
Scott

3
-vcatKomut seçeneği burada gereksizdir çünkü -earaçlar -vEve -taraçlar -vT.
xxks-kkk

2
Birisi sekmelerin yerini alan bir editör kullanıyorsa, sekme karakteri şöyledir:
Ivan Borshchov

32

VS Kodunda, dik köşedeki "Boşluk: 4" ü tıklayıp Makefile'nizi düzenlerken sekmeye değiştirin.


1
Bunu fark etmedim bile - bu bilgi için teşekkürler. Daha önce bir regex find-replace kullanıyordum ama bu çok daha hoş.
Fıstık

VS Code, 'Makefile' sonekinden ayıklanan 'common.mk' dosyamın bir make dosyası olduğunu fark etti ve doğru bir şekilde vurguladı - ama sessizce sekmeler yerine boşluklarla girintilemeye başladı.
Francis Norton

Yardım için teşekkürler! Kesinlikle o alt köşede bir sekme ayarları olduğunu fark etmedi.
se_brandon

28

Komutu her zaman Tabboşluktan değil, boşluktan sonra yazmalısınız .

Bu, davanızdaki gccsatır (satır 4) için geçerlidir. Daha önce sekme eklemeniz gerekir gcc.

Ayrıca değiştirmek \rm -fr llile rm -fr ll. Bu komuttan önce de sekmeler ekleyin.


3
Çok açık olmak gerekirse, her mantıksal tarif satırındaki ilk karakter olarak sert bir SEKME karakteri olmalıdır. SEKME'den sonra istediğiniz herhangi bir boşluk alanını ekleyebilirsiniz.
MadScientist

sekme alanı 2 veya 4'e eşit olmalı mı? /.vimrc sekmesinde tabstop = 2 veya 4?
Rahul Reddy

@RahulReddy bir düzenleyicinin bir sekmeyi nasıl görüntülediğini yapılandırmada bir sekme karakteri olup olmadığı ile ilgisi yoktur.
xaxxon

Büyük ipucu, çünkü önünde boşluklar vardı. Kontrol ettiğimde işe yaradı. Süper :)
indianwebdevil

9

Çözümü PyCharmbir Makefile supporteklenti yüklemek olacaktır :

  1. Açık Preferences( cmd + ,)
  2. Git Plugins->Marketplace
  3. IDE'yi arayın Makefile support, kurun ve yeniden başlatın.

Bu sorunu çözmeli ve bir makefile için bir sözdizimi sağlamalıdır.


Bu ayrıca GoLand'ta da yardımcı olur
Vizjerei

IDE'nin gerçek meselelerini buluyorum. Sekme sürümü pycharm'da desteklenmiyor. ATOM olarak değiştirdiğimde SEKME girişi çalışıyor.
Moonlight Knight

6

Oldukça eski bir soru ama yine vi/vimde sekmeleri görselleştirmek için editör kullanarak bir seçenek hakkında daha söylemek istiyorum . Eğer varsa vi/vimo zaman açık a yüklü Makefile(örn vim Makefileve) girmek :set list. Bu, aşağıdaki gibi eklenen sekme sayısını gösterir,

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

.editorconfigSekmeleri otomatik olarak düzeltmek için kullanma :

root = true

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

[Makefile]
indent_style = tab

4

Anahtar nokta "SABİT SEKME" idi. 1. Boşluk yerine SEKME kullanıp kullanmadığınızı kontrol edin. .Vimrc'nizde "set tabstop = X" olup olmadığını kontrol edin


2

Herhangi biriniz Intellij'den bir ürün kullanıyorsanız, bunun çözümü şudur:

  1. Tercihler> Editör> Kod Stili'ne gidin
  2. burada sorununuzla ilgili dosya türünü seçmeniz gerekir. Ama büyük olasılıkla seçmeniz gerekiyor Other File Types.
  3. Açılan sekmede için onay kutusunu işaretleyin Use tab characterve dikkatli olun Tab sizeve Indentdeğerler 4 olmalıdır.

2

Makefile edit için mcedit kullanıyorsanız. aşağıdaki işareti görmelisiniz. resim açıklamasını buraya girin


0

Çünkü sekme boşluklarla değiştirilir. Bu özelliği devre dışı bırakmak için şu adrese gidin:

gedit-> düzenlemek-> Tercihler-> editör

ve çekini kaldır

" sekmeyi boşlukla değiştir "

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.