我的makefile的结果是:没有生成目标文件“arch/x86/tools/relocs.c”,但它是必需的。

我正在使用Ubuntu 12.04。我编写了一个简单的hello world内核模块(hello.c)。我为它编写了以下makefile:
obj-m+=hello.o
KDIR:= /usr/src/linux-headers-3.2.0-24-generic-pae
all:
     $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
     rm -rf *.o *.ko *.mod.* *.symvers *.order 

但是当我从内核进行编译时,出现了这个错误:

make[1]: Entering directory `/usr/src/linux-headers-3.2.0-24-generic-pae'
make[2]: *** No rule to make target `arch/x86/tools/relocs.c', needed
by `arch/x86/tools/relocs'.  Stop.

hello.cmakefile位于/Documents/module_prog目录中。我从该目录运行了make命令。

是什么导致了这个错误,我该如何修复它?

4个回答

在make文件中,只需将SUBDIRS=$(PWD)更改为M=$(shell pwd)...
像魔法一样运行。

1在我的 make 文件中,SUBDIRS=$(PWD) 不存在。 - Salem F

需要i386头文件:

sudo apt-get install linux-headers-$(uname -r | sed 's/\(.*\)-[a-z]*/\1/'):i386

例子:

sudo apt-get install linux-headers-5.4.0-42:i386

3为什么会有这么多踩?能不能有人帮我理解一下,到底哪里出了问题?请帮帮忙。 - Gabriel Staples
这实际上解决了我的问题。我不明白为什么有人会给这个点赞下降评价。 - If_You_Say_So
1使用 uname -r 命令查找您的内核版本,删除"-generic"部分。 - ki9
1很简单,因为它不起作用:无法找到软件包linux-headers-5.4.0-81-generic:i386 - Eric
1尝试使用 linux-headers-5.4.0-81:i386。这里可以正常工作。 - Adam

要获取适用于您特定内核的头文件...您可能会在稍微不那么聪明的@Thantelius答案的版本上取得更大的成功。
apt search linux-headers-$(uname -r)
apt install <package name showing in the search>

然而,在最新/主要的发行版中,标题应该默认安装。

经过很长时间的研究,我找到了解决办法,就是将makefile的文件名改为Makefile。

这不应该有什么区别,参见这个答案以及Should I name "makefile" or "Makefile"?默认情况下,当make寻找makefile时,它会按照以下顺序尝试这些名称:GNUmakefilemakefileMakefile - Greenonline
我多次进行了测试。确实只能使用“Makefile”才能正常工作。 - Albi