2014-11-21 54 views
2

我有一個簡單的Makefile:的Makefile - 埃羅:文件截斷

CC=g++ 

CFLAGS= -Wall -std=c++11 -M -MF dependencyFileName.d -c 

objects = Table.o LimitedTable.o aDimension.o test.o 

edit: $(objects) 
    g++ -o edit $(objects) 

test.o: LimitedTable.o Table.o aDimension.o test.cpp 
    $(CC) $(CFLAGS) test.cpp -o test.o 

LimitedTable.o: LimitedTable.cpp LimitedTable.hpp Table.o aDimension.o 
    $(CC) $(CFLAGS) LimitedTable.cpp -o LimitedTable.o 

aDimension.o: aDimension.cpp aDimension.cpp Table.o 
    $(CC) $(CFLAGS) aDimension.cpp -o aDimension.o 

Table.o: Table.cpp Table.hpp 
    $(CC) $(CFLAGS) Table.cpp -o Table.o 

clean: 
    rm -f *.o 

,我得到這個錯誤:

[email protected] ~/Documents $ make clean 
rm -f *.o 
[email protected] ~/Documents $ make edit 
g++ -Wall -std=c++11 -M -MF dependencyFileName.d -c Table.cpp -o Table.o 
g++ -Wall -std=c++11 -M -MF dependencyFileName.d -c aDimension.cpp -o aDimension.o 
g++ -Wall -std=c++11 -M -MF dependencyFileName.d -c LimitedTable.cpp -o LimitedTable.o 
g++ -Wall -std=c++11 -M -MF dependencyFileName.d -c test.cpp -o test.o 
g++ -o edit Table.o LimitedTable.o aDimension.o test.o 
Table.o: file not recognized: File truncated 
collect2: error: ld returned 1 exit status 
make: *** [edit] Error 1 

誰能告訴我什麼是錯? 錯誤是否包含在其中一個文件中是導致此錯誤的原因?

+1

「File truncated」聽起來像「意外的文件結束」。如果通過運行'g ++ -Wall -std = C++ 11 -c Table.cpp -o Table.o'而不使用'make'手動重新生成它?如果你試圖把它與一個微不足道的「你好,世界」'main'聯繫起來? – Potatoswatter 2014-11-22 00:14:57

+0

好吧,我會明天嘗試 – 2014-11-22 00:26:03

回答

4

有一些問題,你處理你所依賴的文件的方式,但首先:

I have a simple Makefile

不,你不會。樣板代碼的數量太高,並且將任何文件添加到您的projet將需要您再次手動編輯該makefile。

你的Makefile應當歸結爲:

SRC   := $(wildcard *.cpp) 
OBJ   := $(SRC:.cpp=.o) 
DEP   := $(OBJ:.o=.d) 
CPPFLAGS := -MMD -MP 
CXXFLAGS := -std=c++11 -Wall 

edit: $(OBJ) 
    $(CXX) $^ -o [email protected] 

-include $(DEP) 

clean: 
    $(RM) $(OBJ) $(DEP) 

在這裏,您:

  • 避免重蹈自己太大,
  • 善用化妝的潛規則,以節省時間,
  • 使用正確的內置變量而不是覆蓋錯誤的,
  • 正確的哈ndle相關性文件創建實際上使用它們來防止手動重新編譯,
  • 將文件添加到項目時不需要編輯生成文件。

此外,這應該解決您的問題。 在發生這樣的錯誤(「文件被截斷」)之後,在嘗試再次編譯之前不要忘記清理。

+0

好吧,看起來更好的方式謝謝:)但通配符是什麼意思?它是否將當前目錄中的所有源文件? – 2014-11-23 12:30:58

+0

就是這樣,如果您需要指定每個文件進行編譯,則可以將其刪除。你也可以指定一個相對路徑,如'$(wildcard src/*。cpp)'。 – Chnossos 2014-11-23 12:58:21

+0

和make會自動識別繼承的文件之間的依賴關係? – 2014-11-23 13:04:46