驱动程序未编译“没有规则来制作目标”

Posted

技术标签:

【中文标题】驱动程序未编译“没有规则来制作目标”【英文标题】:Driver is not compiling "No rule to make target" 【发布时间】:2020-09-21 18:45:45 【问题描述】:

编译此驱动程序:

echo "obj-m := tiny_i2c_adap.o" > Makefile make -C SUBDIRS=$PWD 模块

生成文件: obj-m := tiny_i2c_adap.o

错误: prashanth@prashanth-Lenovo-ideapad-520-15IKB:~$ make -C /usr/src/linux-headers-$(uname -r) M=$PWD modules make: 进入目录'/usr/src/linux-headers-5.1.7-050107-generic' make[1]: * 没有规则来制作“/home/prashanth/tiny_i2c_adap.o”需要的目标“/home/prashanth/tiny_i2c_adap.c”。停止。 Makefile:1571: 目标 'module/home/prashanth' 的配方失败 make: * [module/home/prashanth] 错误 2 make: 离开目录'/usr/src/linux-headers-5.1.7-050107-generic'

【问题讨论】:

您打算从包含 C 源文件 (tiny_i2c_adap.c) 的目录中执行该构建命令。你没有这样做。 发布问题后,您应该重新阅读以确保其清晰。当你这样做时,你会注意到你的问题的格式都搞砸了,使它不可读。然后您应该继续对其进行编辑以更正格式:请参阅***.com/editing-help 当然更好的办法是通过检查条目下方的问题预览来注意到格式完全混乱并且问题在发布之前 不可读文本框:) 【参考方案1】:

记住$PWD 是一个shell 变量,它包含当前工作目录。所以当你运行时:

~$ make -C /usr/src/linux-headers-$(uname -r) M=$PWD modules

$PWD 的值是你运行 make 时所在的目录(在本例中是你的主目录),所以你正在运行:

~$ make -C /usr/src/linux-headers-$(uname -r) M=/home/prashanth modules

因此内核 makefile 假定您的模块位于 /home/prashanth 中,因为这是您将 M 变量设置为的位置。

您需要为M 使用正确的路径,或者在调用make 之前使用cd 切换到包含您的源代码的目录,这样$PWD 将包含正确的路径。

【讨论】:

以上是关于驱动程序未编译“没有规则来制作目标”的主要内容,如果未能解决你的问题,请参考以下文章

Makefiles 链是一团糟:没有规则来制作目标

没有规则可以制作目标Cuda + Qt + Linux

没有规则来制作目标.o,为啥?

*** 没有规则来制作目标 `src/main/jni/Build.config'。停止

Makefile:没有规则来制作目标。停止

linux C++ gmake“没有规则来制作目标”