make:没有什么可以做的“全部”

我正在通过例如pgm来创build一个make文件。

http://mrbook.org/tutorials/make/

我的文件夹eg_make_creation包含以下文件,

desktop:~/eg_make_creation$ ls factorial.c functions.h hello hello.c main.c Makefile 

Makefile文件

 # I am a comment, and I want to say that the variable CC will be # the compiler to use. CC=gcc # Hwy!, I am comment no.2. I want to say that CFLAGS will be the #options I'll pass to the compiler CFLAGS=-c -Wall all:hello hello:main.o factorial.o hello.o $(CC) main.o factorial.o hello.o -o hello main.o:main.c $(CC) $(CFLAGS) main.c factorial.o:factorial.c $(CC) $(CFLAGS) factorial.c hello.o:hello.c $(CC) $(CFLAGS) hello.c clean: rm -rf *o hello 

错误:

 desktop:~/eg_make_creation$ make all make: Nothing to be done for `all'. 

请帮我理解编译这个程序。

在makefile规则而不是tab中,有时候“没有任何事情可以做”错误可能是由makefile规则之前的空格引起的。 请确保您使用制表符而不是规则中的空格。

 all: <\t>$(CC) $(CFLAGS) ... 

代替

 all: $(CC) $(CFLAGS) ... 

从您的文件夹中删除hello文件,然后重试。

all目标取决于hello目标。 hello目标首先尝试在文件系统中find相应的文件。 如果发现它,并且与依赖文件保持一致,则无事可做。

当你给make的时候,make就是makefile中的第一条规则,比如“all”。 你已经指定“all”取决于“hello”,这取决于main.o,factorial.o和hello.o。 所以'make'试图看看这些文件是否存在。

如果它们存在,那么'make'会查看它们的依赖项,例如main.o是否具有依赖项main.c,是否发生了变化。 如果他们已经改变,重build他们,否则跳过规则。 同样,它recursion地继续构build已经改变的文件,并最终运行最上面的命令,在你的情况下,“all”给你一个可执行文件,“你好”在你的情况。

如果他们不在场,盲目地build立在统治之下的一切。

来到你的问题,这不是一个错误,但'make'是说你的生成文件中的每个依赖项是最新的,它不需要做任何事情!

Makeperformance正确。 hello已经存在,不比.c文件更旧,因此没有更多的工作要做。 有四个场景需要(重新)构build:

  • 如果你修改了一个.c文件,那么它会比hello ,然后当你运行make时,它将不得不重build。
  • 如果你删除了hello ,那么显然必须重build它
  • 您可以强制make使用-B选项重build所有内容。 make -B all
  • make clean all将删除hello并要求重build。 (我build议你看一下@Mat对rm -f *.o hello的评论rm -f *.o hello

这不是一个错误,在unix的make命令基于时间戳,也就是说,如果你已经对factorial.cpp进行了某些更改,并使用make..then进行编译,那么只显示** cc -o阶乘的信息。 cpp **命令被执行。下一次,如果你执行相同的命令,即不改变任何扩展名为.cpp的文件,那么编译器会说输出文件是最新的…编译器会提供这个信息,直到我们对任何file.cpp进行某些更改。 make文件的优点是通过编译唯一被修改的文件并直接使用未修改文件的对象(.o)文件来减less重新编译时间……