2014-02-11 85 views
1

我已經閱讀了類似的問題,但無法找到解決我的問題的方法。這裏是有問題的生成文件:Makefile錯誤:意外的行結束

EXE = proj05 
SOURCES = proj05.support.c proj05.driver.c 
OBJECTS := $(SOURCES:%.c=%.o) 
CCFLAGS = -Wall 

$(EXE): $(OBJECTS) 
<tab>$(CC) $^ -o [email protected] o 
clean: 
<tab>$(RM) $(EXE) $(OBJECTS) 

當我試圖運行make,我得到一個錯誤說「行意外結束看過」線路4.這是怎麼回事?

編輯:我改變了瘋狂的重複的東西,但仍然得到相同的錯誤。

+0

GNU make將永遠不會在任何地方打印帶有「unexpected」字樣的錯誤消息。這真的是一個確切的錯誤信息(你不應該在尋求幫助時解釋錯誤信息:總是剪切並粘貼整個確切的信息)?如果是這樣,那麼要麼你沒有使用GNU make(請指定操作系統並讓你使用),否則這個錯誤不是由make生成的。當你遇到錯誤時,很可能在編譯源文件時出現問題。同樣,如果您剪切並粘貼錯誤消息,這將立即清除,並節省了很多混淆。 – MadScientist

+0

好吧,確切的錯誤信息:「make:讀者的致命錯誤:makefile,第4行:意外的行結束」這是在SunOS上,所以不是GNU make。 – spartanhooah

+0

那我真的不能幫上忙。我懷疑是在從Powerpoint(!)剪切和粘貼過程中,一些特殊的非ASCII字符在第4行中徘徊,這很難看出來。也許'-Wall'中的'-'不是ASCII連字符(代碼45),但是一些Solaris製作不能識別的擴展em或破折號字符。我會嘗試使用直接的文本編輯器(如vi或Emacs)從頭開始編寫這個makefile,或者至少是第4行。或者,你可以使用'od -a Makefile'之類的東西,看看第4行是否有奇怪的字符。 – MadScientist

回答

1

第一條命令的單美元是怎麼回事?

<tab>$(CC) >>$<< $(CC) ... 
1

的「4號線」是有點誤導,但是這是$(EXE)規則的,讓解析器 決定它不能進行任何進一步的前到了線。由於@ jia103暗示 爲,您的$(EXE)規則中有一個虛假$。您也有 出現錯誤的編譯器標記語法 - -o之間不應有任何空格 ,以形成輸出參數-o [email protected]

我可以建議以下規則,而不是$(EXE)clean規則 您有嗎?

%.o: %.c 
<tab>$(CC) $(CFLAGS) -o [email protected] $< 

$(EXE): $(OBJECTS) 
<tab>$(CC) $(CFLAGS) -o [email protected] $(OBJECTS) 

clean: 
<tab>$(RM) $(EXE) $(OBJECTS) 

(記住更改爲實際的製表符...)

的最後一件事 - 如果你正在使用的Solaris和Sun做,有一個像樣的機會,你的C編譯器實際上是工作室的Solaris 。在這種情況下,-Wall標誌不起作用 - 這是一個gcc標誌。請撥cc -flags查看Studio C有哪些選項可用。

+0

這就是我從powerpoint複製而不是徹底檢查它的情況! – spartanhooah

+0

我編輯了我原來的帖子,因爲即使在修復borked的東西之後,我仍然得到相同的錯誤。 – spartanhooah

+0

首先,你的$(CC)線上還有一個虛假的試用'o'。 其次,你期待'$ ^'擴展到什麼? –

0

難道你不需要不同部分之間的空白行嗎?詹姆斯的片段有%.o:目標,後面跟着一個空行,然後是$(EXE):目標,後面跟着一個空行,然後是目標clean:

現在我再想一想,我相信空行不是可選的。

在你的代碼片段中,嘗試在以<tab>開頭的那個和以clean:開頭的那個之間加一條空行。

+0

規則之間不需要空行。實際上,你甚至可以編寫這樣的規則: '%.o:%.c; $(COMPILE.c)$(CFLAGS)-o $ @ $ <'' ...如果你想。有時候這是一種適當的表達方式,有時不是。 –

1

有可能你有不同系統的換行符(例如Unix makefile中的Windows換行符號)。

您可以在Notepad ++:edit-> EOL conversion-> Unix(或Windows或Old Mac)中修復它,或者您可以在要編譯的機器上手動重新輸入換行符。