【问题标题】:make: Nothing to be done for `all'make: 'all' 无事可做
【发布时间】:2012-01-23 14:26:12
【问题描述】:

我正在通过一个例如 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

生成文件

# 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'.

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

【问题讨论】:

  • 尝试做一个“make clean”,然后是一个“make all”
  • 这不是错误,它只是意味着hello 是最新的。在它发生意外之前将clean 更改为rm -f *.o hello,然后运行make clean all 看看是否可行。
  • 您还应该添加.phony: all clean,因为allclean 不是文件名。
  • 不要把 -c 放在你的 CFLAGS 中。

标签: c makefile


【解决方案1】:

有时“Nothing to be done for all”错误可能是由 makefile 规则中命令前的空格而不是制表符引起的。请确保在规则中使用制表符而不是空格。

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

而不是

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

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

【讨论】:

  • obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make - C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
  • 上述文件是有效文件吗??
  • 在父子 makefile 的上下文中,有时“Nothing to be done for all”错误可能是由于子目标在父 Makefile 中被错误地标记为声明的 .PHONY。
  • 我有all : src/server/mod_wsgi.la,我将其更改为all : &lt;/t&gt; src/server/mod_wsgi.la。我现在得到错误:sudo make 之后的make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127。有什么帮助吗?
  • @Mooncrater 见gnu.org/software/make/manual/make.html#Rule-Syntax。此处显示:配方行以制表符开头(或 .RECIPEPREFIX 变量值中的第一个字符;请参阅特殊变量)。第一个配方行可能出现在先决条件之后的行上,带有一个制表符,也可能出现在同一行上,带有一个分号。无论哪种方式,效果都是一样的。所以,你的先决条件就变成了食谱。在这种情况下,您不需要选项卡。
【解决方案2】:

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

all 目标取决于hello 目标。 hello 目标首先尝试在文件系统中找到相应的文件。如果它找到它并且它与依赖文件是最新的 - 没有什么可做的。

【讨论】:

  • obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make - C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
  • 以上是一个有效的make文件吗?
【解决方案3】:

当你只给出 make 时,它​​会在你的 makefile 中创建第一条规则,即“all”。您已指定“all”依赖于“hello”,后者依赖于 main.o、factorial.o 和 hello.o。所以'make'会尝试查看这些文件是否存在。

如果它们存在,'make' 会查看它们的依赖关系,例如main.o 有一个依赖 main.c,已经改变。如果它们已更改,则 make 重建它们,否则跳过规则。同样,它递归地继续构建已更改的文件,最后运行最上面的命令,在您的情况下为“all”,为您提供可执行文件,在您的情况下为“hello”。

如果它们不存在,make 会盲目地按照规则构建所有内容。

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

【讨论】:

    【解决方案4】:

    Make 行为正确。 hello 已经存在并且不早于.c 文件,因此没有更多工作要做。在四种情况下,make 需要(重新)构建:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          使用 Paul R 的评论,我发现

          make clean
          

          紧随其后

          make
          

          make all
          

          解决了我的问题。

          【讨论】:

            【解决方案8】:

            我通过不同的途径遇到了这个特殊的、难以调试的错误。我的麻烦最终是当目标和依赖项位于不同的目录中时,我在构建步骤中使用了模式规则。像这样的:

            foo/apple.o: bar/apple.c $(FOODEPS)
            
            %.o: %.c
                $(CC) $< -o $@
            

            我以这种方式设置了几个依赖项,并试图为它们都使用一个模式配方。很明显,“%”的单个替换在这里是行不通的。我为每个依赖项制定了明确的规则,我发现自己又回到了小狗和独角兽之中!

            foo/apple.o: bar/apple.c $(FOODEPS)
                $(CC) $< -o $@
            

            希望这对某人有所帮助!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-10-10
              • 1970-01-01
              • 2013-11-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多