Buat kesalahan: pemisah hilang


Jawaban:


364

Seperti ditunjukkan dalam manual online , penyebab paling umum untuk kesalahan itu adalah bahwa garis diindentasi dengan spasi saat makemengharapkan karakter tab.

Benar

target: 
\tcmd

dimana \tTAB (U + 0009)

Salah

target:
....cmd

di mana masing-masing .mewakili SPACE (U + 0020).


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

16

Hanya untuk menyeringai, dan kalau-kalau ada orang lain mengalami kesalahan yang sama:

Saya mendapat kesalahan "pemisah yang hilang" yang terkenal karena saya telah menjalankan aturan yang mendefinisikan fungsi sebagai

($eval $(call function,args))

daripada

$(eval $(call function,args))

yaitu ($bukan $(.


Apa? :) Saya kira Anda tidak memiliki 0x20"ruang" di sana, apakah itu benar?
user35443

3
@ user35443 Penempatan$
smac89

8

Ini adalah kesalahan sintaksis di Makefile Anda. Cukup sulit untuk lebih spesifik dari itu, tanpa melihat file itu sendiri, atau bagian yang relevan.


5

Bagi saya, masalahnya adalah bahwa saya memiliki beberapa # ...komentar end-of-line yang tertanam dalam define ... endefdefinisi variabel multi-line. Menghapus komentar membuat masalah hilang.


Terima kasih. Saya tidak tahu komentar dalam definearahan diperlakukan secara harfiah. Sebenarnya perilaku itu tidak dijelaskan dalam dokumentasi . (Untuk kejelasan: Menyematkan tanda angka #di dalam direktif itu sendiri bukan kesalahan sintaks. Tapi itu tidak diartikan sebagai awal dari sebuah komentar, jadi melakukan hal itu memang cenderung rawan kesalahan.)
ynn

3

Kesalahan saya ada pada baris deklarasi variabel dengan ekstensi multi-baris. Saya memiliki spasi tambahan setelah "\" yang menjadikannya kelanjutan garis yang tidak valid.

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

1

Dalam kasus saya kesalahan yang disebabkan selanjutnya. Saya sudah mencoba menjalankan perintah secara global yaitu di luar target apa pun.

UPD. Untuk menjalankan perintah secara global, seseorang harus dibentuk dengan benar. Misalnya perintah

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

akan menjadi:

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

1

Dalam kasus saya, kesalahan yang sama disebabkan karena titik dua :hilang pada akhirnya seperti pada staging.deploy:. Jadi catat bahwa itu bisa menjadi kesalahan sintaksis yang mudah.


1

Dalam kasus saya, saya benar-benar kehilangan tab di antara ifeqdan perintah di baris berikutnya. Tidak ada ruang untuk memulai.

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

Seharusnya:

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

Perhatikan bahwa <tab>ini adalah karakter tab yang sebenarnya


0

Dalam kasus saya, kesalahan ini disebabkan oleh kurangnya ruang belaka. Saya punya ini jika memblokir di makefile saya:

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

yang seharusnya:

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

dengan spasi setelah jika.



-1

Begitu rupanya, semua saya butuhkan adalah "build-essential" paket, maka untuk menjalankan autoconfpertama, yang membuat Makefile.pre.in, maka ./configuremaka makeyang bekerja sempurna ...


-2

Kode Makefile berikut berfungsi:

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