为什么make命令会出现“make: Nothing to be done for `all'.”的提示?

9
这是一个名为“Hello.c”的模块和一个“Makefile”。从工作目录执行make后,会得到以下信息:

make: 没有东西要做。

这是“Hello.c”文件:
#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>    // included for KERN_INFO
#include <linux/init.h>      // included for __init and __exit macros

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Lakshmanan");
MODULE_DESCRIPTION("A Simple Hello World module");

static int __init hello_init(void) {
  printk(KERN_INFO "Hello world!\n");
  return 0;    // Non-zero return means that the module couldn't be
}

static void __exit hello_cleanup(void) {
    printk(KERN_INFO "Cleaning up module.\n");
}   

module_init(hello_init); 
module_exit(hello_cleanup);

还有“Makefile”:

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

我尝试了所有建议,终端上显示如下内容:
root@stupid-HP:/home/stupid/cpz/module$ pwd
/home/stupid/cpz/module
root@stupid-HP:/home/stupid/cpz/module$ ls
hello.c  Makefile
root@stupid-HP:/home/stupid/cpz/module$ make
make: Nothing to be done for `all'.
root@stupid-HP:/home/stupid/cpz/module$ make clean
make: Nothing to be done for `clean'.
root@stupid-HP:/home/stupid/cpz/module$ make clean all
make: Nothing to be done for `clean'.
make: Nothing to be done for `all'.
root@stupid-HP:/home/stupid/cpz/module$ ls
hello.c  Makefile
root@stupid-HP:/home/stupid/cpz/module$ make
make: Nothing to be done for `all'.
root@stupid-HP:/home/stupid/cpz/module$ vi hello.c  # modified again
root@stupid-HP:/home/stupid/cpz/module$ make clean
make: Nothing to be done for `clean'.
root@stupid-HP:/home/stupid/cpz/module$ make
make: Nothing to be done for `all'.

我已经检查过了,在当前工作目录中没有其他的makefile文件,只有两个文件hello.c和makefile。(感谢回复) - user55111
如果您的程序已经构建完成,编译器将不会被调用。您需要修改源文件或删除编译器输出以获得新的编译器运行。这是基于时间戳的。 - usr1234567
1
这可能只是意味着 hello.o 是最新的。您可以运行 make clean all,看看是否会再次收到该消息。 - BlackDwarf
2
请确保使用TAB(而不是空格)缩进make -C ... - sergej
1
@sergej 谢谢你..正如你所说,我在 Makefile 中删除了空格,并用 TAB 替换了它们。现在它正在工作,我能够使用 insmod 命令了。 - user55111
显示剩余3条评论
6个回答

33
  1. make clean 然后再次 make
  2. 按照 makefile 格式检查空格和制表符
  3. 验证内核库的路径

上帝啊,他已经帮我清理了!为什么我还要自己清理呢? - Curnelious
@Curnelious,"clean" 是一种操作,它可以清除之前的构建文件,确保你得到一个干净的构建,并且不会有任何旧的文件留存在之前的构建中。 - Dilip Kumar

10

Make基于时间戳工作。如果您修改源文件中的一些内容,则Make会编译它们并相应地构建映像。如果您没有更改源文件,则编译器与您的项目无关。make不像gcc一样每次都要编译,无论是否需要新的构建。这是使用make进行项目时的许多优点之一。


如何强制编译代码?忽略更改检查。 - Dr.jacky
2
我不知道这样的方法,但您可以使用touch更改时间戳或进行清理,然后重新制作。 - incompetent

7

您应该在Makefile中删除空格。在makefile中,只使用制表符。

我再次测试了您的代码,并且它可以使用制表符正常工作。


2
编译器告诉你,你的代码已经被编译过了,并且代码没有任何更改(即代码是最新的),所以它不会再次编译。这是编译器的内置功能,如果源代码文件没有更改,编译器就不会浪费时间。
在执行make之前使用make clean或修改Hello.c并构建你的项目。

我输入了两个命令,我编辑了问题以便您可以检查响应。我正在使用Ubuntu 14.04。我在当前工作目录中编写了hello.c和makefile,并尝试将此模块添加到内核中。我是否漏掉了任何步骤? - user55111
make clean clean all non-folder files, doesn't work on my Ubuntu 20.04LTS - Rγσ ξηg Lιαη Ημ 雷欧
这取决于你的 makefile。它是否定义了一个清理规则? - LPs

1

尝试使用 make clean 命令删除可执行文件(./a.out),然后再次尝试编译!你可能在某个函数中做了一些更改,但 make 无法看到它。


1

以防万一有人遇到和我一样的问题:

当你的某个文件夹与可执行文件同名时,Eclipse构建会失败。如果出现这种情况,无论你做什么,都会收到“没有任何事情需要完成”的消息。解决方法是重命名文件夹或可执行文件。详细信息可以在此处找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接