2014-11-21 50 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