make:'all'无所事事

Ang*_*gus 86 c makefile

我正在通过一个例如pgm来创建一个make文件.

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

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

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

错误:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.
Run Code Online (Sandbox Code Playgroud)

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

Vir*_*VDX 103

有时在makefile规则中的命令之前的空格而不是tab中,"没有什么可以为所有人做"错误可能是由空格引起的.请确保在规则中使用制表符而不是空格.

all:
<\t>$(CC) $(CFLAGS) ...
Run Code Online (Sandbox Code Playgroud)

代替

all:
    $(CC) $(CFLAGS) ...
Run Code Online (Sandbox Code Playgroud)

有关规则语法说明,请参阅GNU make手册:https://www.gnu.org/software/make/manual/make.html#Rule-Syntax


wee*_*ens 30

hello文件夹中删除该文件,然后重试.

all目标依赖于hello目标.该hello目标首先尝试找到文件系统中的相应文件.如果它找到它并且它与依赖文件是最新的 - 那么无所事事.


Che*_*ath 20

当你只是make,它会在你的makefile中创建第一个规则,即"all".您已指定"all"取决于"hello",这取决于main.o,factorial.o和hello.o.所以'make'试图查看这些文件是否存在.

如果它们存在,'make'会查看它们的依赖项(例如main.o是否具有依赖项main.c)是否已更改.如果它们已更改,请重建它们,否则跳过规则.类似地,它递归地继续构建已更改的文件,最后运行最顶层的命令,在您的情况下为"all"提供可执行文件,在您的情况下为"hello".

如果他们不在场,请盲目地建立规则下的一切.

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


Aar*_*aid 14

Make表现正常.hello已经存在并且不比.c文件旧,因此没有更多的工作要做.有四种情况需要(重新)构建make:

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


Sny*_*mpi 8

根据 Paul R 的评论,我发现

make clean
Run Code Online (Sandbox Code Playgroud)

其次是

make
Run Code Online (Sandbox Code Playgroud)

或者

make all
Run Code Online (Sandbox Code Playgroud)

解决了我的问题。


小智 5

这不是错误;unix 中的 make 命令基于时间戳工作。也就是说,如果您对使用进行了某些更改factorial.cpp和编译,make那么 make 会显示仅cc -o factorial.cpp执行命令的信息。下次如果您执行相同的命令,即make没有对任何带有.cpp扩展名的文件进行任何更改,编译器会说输出文件是最新的。编译器会提供此信息,直到我们对任何file.cpp.

的优点makefile是它通过只编译被修改.o的文件和直接使用未修改文件的目标 ( ) 文件来减少重新编译的时间。


小智 5

我想你错过了第 9 行的一个标签。all:hello后面的行必须是一个空白选项卡。确保您在第 9 行有一个空白选项卡。它会让解释器明白你想使用 makefile 的默认配方。