Makefile make[1]:***/lib/modules//build/:没有这样的文件或目录。停止

Makefile make[1]:***/lib/modules//build/:没有这样的文件或目录。停止,makefile,module,linux-kernel,kernel-module,archlinux,Makefile,Module,Linux Kernel,Kernel Module,Archlinux,我在一个ARCH linux发行版中使用Makefile编译内核模块thermal.c 生成文件: obj-m += thermal.o all: make -C /lib/modules/$(uname -r)/build/ M=$(PWD) modules clean: make -C /lib/modules/$(uname -r)/build/ M=$(PWD) clean make命令输出为: make -C /lib/modules//build/ M=/hom

我在一个ARCH linux发行版中使用Makefile编译内核模块thermal.c

生成文件:

obj-m += thermal.o

all:
    make -C /lib/modules/$(uname -r)/build/ M=$(PWD) modules

clean:
    make -C /lib/modules/$(uname -r)/build/ M=$(PWD) clean
make命令输出为:

make -C /lib/modules//build/ M=/home/user/dir modules
make[1]: *** /lib/modules//build/: No such file or directory.  Stop.
make: *** [Makefile:4: all] Error 2


uname-r
输出:5.6.8-arch1-1make在将配方传递给shell之前展开配方。在本例中,make被名为
PWD
(正确)的make变量的值替换为
$(PWD)
,但它也被名为
uname-r
的make变量的值替换为
$(uname-r)
。由于没有定义这样的make变量,结果是空字符串。使用
$$(uname-r)
解决了这个问题,因为make将其扩展为
$(uname-r)
,这正是您想要传递给shell的内容

总之,您必须通过将它们加倍来避免make扩展中要保留的
$

all:
    make -C /lib/modules/$$(uname -r)/build/ M=$(PWD) modules

clean:
    make -C /lib/modules/$$(uname -r)/build/ M=$(PWD) clean

或者可以使用
`uname-r`
变体。