2012-03-06 282 views
8

下面的Makefile不起作用,我不確定發生了什麼。在Makefile中缺少分隔符?

CC = gcc 
CFLAGS = -Wall -g 

demo: 
    ${CC} ${CFLAGS} demo.c -o demo 
lib: 
    ${CC} ${CFLAGS} lib.c -o lib 
clean: 
    rm -f lib demo 

Demo有主函數,lib有一套演示中使用的方法。

我將-c標誌添加到lib中。然而,當我運行make,我得到:

Makefile:5: *** missing separator. Stop. 
+1

你是什麼意思的「不工作」?你得到什麼錯誤?發生什麼事?什麼是不發生? – Mat 2012-03-06 09:01:03

+1

你能告訴我們錯誤嗎? – MByD 2012-03-06 09:01:12

+0

對不起,現在加入。 – Kobi 2012-03-06 09:06:52

回答

30

鑑於與錯誤的更新,請檢查您必須在這些${CC}命令前行的。許多make程序需要一個真實的製表符,然後放入八個空格(例如)的命令和編輯器將打斷它們。這通常不是「缺少分隔符」錯誤的原因。

你可以看到,與以下成績單。在該文件中,也有$(xyzzy)前4位:

xyzzy=echo 
all: 
    $(xyzzy) hello 

所以,當我做了,我得到了同樣的錯誤,你:

pax> make 
makefile:3: *** missing separator. Stop. 

但是,當我編輯,並把這些四個空格成片,它工作正常:

pax> make 
echo hello 
hello 

你也有你試圖COM的方式有問題將源文件彙集在一起​​。

沒有一個-c標誌gcc,它會嘗試從這些命令中的每個創建一個單獨的可執行文件,幾乎可以肯定導致鏈接錯誤。你會需要這樣的東西(簡單):

CC = gcc 
CFLAGS = -Wall -g 

# Just compile/link all files in one hit. 
demo: demo.c lib.c 
    ${CC} ${CFLAGS} -o demo demo.c lib.c 

clean: 
    rm -f demo 

或(稍微複雜):

CC = gcc 
CFLAGS1 = -Wall -g -c 
CFLAGS2 = -g 

# Link the two object files together. 

demo: demo.o lib.o 
    ${CC} ${CFLAGS2} -o demo demo.o lib.o 

# Compile each source file to an object. 

demo.o: demo.c 
    ${CC} ${CFLAGS1} -o demo.o demo.c 

lib.o: lib.c 
    ${CC} ${CFLAGS1} -o lib.o lib.c 

clean: 
    rm -f demo 

與第一解決方案的問題是,它無需編譯兩個程序即使只有一個已過期。第二種解決方案更智能一點。萬一

demo: lib demo.c 

${CC} ${CFLAGS} lib.c -c -o lib.o 
+0

我已經添加到了'.editorconfig': [Makefile文件] indent_style =標籤 indent_size = 4 – DUzun 2018-02-04 22:24:57

+1

@DUzun,假設'Makefile'您的評論是文件名,你可能想也考慮做它也適用於'makefile'和'* .mk'(以及任何其他需要使用的make文件變體)。 – paxdiablo 2018-02-05 00:45:08

1

lib需要被編譯爲一個庫,而不是一個項目。

嘗試將其更改爲:

main: 
    ${CC} ${CFLAGS} main.c lib.o -o main 
lib: 
    ${CC} ${CFLAGS} lib.c -c -o lib.o 
+0

謝謝,但問題仍然存在。我想鏈接lib到main,所以它知道它可以使用lib中的函數。 – Kobi 2012-03-06 09:07:28

0

由於main取決於lib

通常我的編輯器會用空格替換標籤,我會得到這個消息。

CC = gcc 
CFLAGS = -Wall -g 

demo: 
[TAB]${CC} ${CFLAGS} demo.c -o demo 
lib: 
[TAB]${CC} ${CFLAGS} lib.c -o lib 
clean: 
[TAB]rm -f lib demo 
5

你錯過了一些 「標籤」(\t${CC}前: