简单 ubuntu 内核模块 make 文件错误
Simple ubuntu kernel module make file error
我正在尝试构建一个非常简单的内核模块,但我遇到了这个错误:
make -C /lib/modules/5.16.14-051614-generic/build M=/home/nanyo/Documents /ProgrammingEnvs/LinuxKernelDriver modules
make[1]: Entering directory '/usr/src/linux-headers-5.16.14-051614-generic'
make[2]: *** No rule to make target '/home/nanyo/Documents/ProgrammingEnvs/LinuxKernelDriver/hi.o', needed by '/home/nanyo/Documents/ProgrammingEnvs/LinuxKernelDriver/hi.mod'. Stop.
make[1]: *** [Makefile:1852: /home/nanyo/Documents/ProgrammingEnvs/LinuxKernelDriver] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.16.14-051614-generic'
make: *** [Makefile:4: all] Error 2
这是生成文件:
obj-m += hi.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) clean
虽然栈溢出也有类似的错误none 其中具体说no rule to target '.../name.o' needed by '.../name.mod'
我运行就这样~/Documents/ProgrammingEnvs/LinuxKernelDriver$ make
。使用 sudo 尝试从其他问题中提出的任何建议解决方案并尝试使用 CURDIR 和 PWD 都没有帮助。
我 运行正在 Ubuntu 22.04 jammy,使用 5.16.14 内核(我必须 运行 这个内核,因为旧的内核似乎不能很好地与我的 VERY 一起工作最近的硬件)
我已经尝试编译 15 行代码 2 天了,求助! :)
如果您要求 make
构建目标文件,如 hi.o
,它会查找源文件以从中构建目标文件。它不会寻找任何随机源文件(如果你有 20 个源文件怎么办?它应该如何确定你指的是哪一个?),它会根据目标文件的名称寻找源文件。
所以如果你想把C代码编译成hi.o
,make会寻找一个名为hi.c
的源文件。如果你想把 C++ 代码编译成 hi.o
,make 会寻找像 hi.cpp
这样的源文件。如果你想编译 Fortran,make 会寻找 hi.f
,等等
请注意,Linux 系统与 Windows 和 MacOS 不同,使用 case-sensitive 文件名,因此 hi.c
、Hi.c
、HI.c
等. 都是不同的文件,hi.o
只会匹配第一个文件。
如果 make 找不到与目标文件名称相关的源文件,它不会说“好吧,这里只有一个源文件,那一定是他们的意思”。这种任意行为在构建工具中是一件坏事:make 完全按照您的指示去做,如果做不到,它也不会尝试猜测您的意思。它给你一个错误,比如 no rule to make target 'hi.o'.
如果你出于某种原因想使用不同的对象和源名称,你可以这样做,但你必须通过编写自己的明确规则来告诉 make:
hi.o : mycoolfile.c
<recipe to build hi.o from mycoolfile.c>
由于内核构建无法知道您可能选择的源文件名,因此您必须在自己的 makefile 中编写这些规则。
我正在尝试构建一个非常简单的内核模块,但我遇到了这个错误:
make -C /lib/modules/5.16.14-051614-generic/build M=/home/nanyo/Documents /ProgrammingEnvs/LinuxKernelDriver modules
make[1]: Entering directory '/usr/src/linux-headers-5.16.14-051614-generic'
make[2]: *** No rule to make target '/home/nanyo/Documents/ProgrammingEnvs/LinuxKernelDriver/hi.o', needed by '/home/nanyo/Documents/ProgrammingEnvs/LinuxKernelDriver/hi.mod'. Stop.
make[1]: *** [Makefile:1852: /home/nanyo/Documents/ProgrammingEnvs/LinuxKernelDriver] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.16.14-051614-generic'
make: *** [Makefile:4: all] Error 2
这是生成文件:
obj-m += hi.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) clean
虽然栈溢出也有类似的错误none 其中具体说no rule to target '.../name.o' needed by '.../name.mod'
我运行就这样~/Documents/ProgrammingEnvs/LinuxKernelDriver$ make
。使用 sudo 尝试从其他问题中提出的任何建议解决方案并尝试使用 CURDIR 和 PWD 都没有帮助。
我 运行正在 Ubuntu 22.04 jammy,使用 5.16.14 内核(我必须 运行 这个内核,因为旧的内核似乎不能很好地与我的 VERY 一起工作最近的硬件)
我已经尝试编译 15 行代码 2 天了,求助! :)
如果您要求 make
构建目标文件,如 hi.o
,它会查找源文件以从中构建目标文件。它不会寻找任何随机源文件(如果你有 20 个源文件怎么办?它应该如何确定你指的是哪一个?),它会根据目标文件的名称寻找源文件。
所以如果你想把C代码编译成hi.o
,make会寻找一个名为hi.c
的源文件。如果你想把 C++ 代码编译成 hi.o
,make 会寻找像 hi.cpp
这样的源文件。如果你想编译 Fortran,make 会寻找 hi.f
,等等
请注意,Linux 系统与 Windows 和 MacOS 不同,使用 case-sensitive 文件名,因此 hi.c
、Hi.c
、HI.c
等. 都是不同的文件,hi.o
只会匹配第一个文件。
如果 make 找不到与目标文件名称相关的源文件,它不会说“好吧,这里只有一个源文件,那一定是他们的意思”。这种任意行为在构建工具中是一件坏事:make 完全按照您的指示去做,如果做不到,它也不会尝试猜测您的意思。它给你一个错误,比如 no rule to make target 'hi.o'.
如果你出于某种原因想使用不同的对象和源名称,你可以这样做,但你必须通过编写自己的明确规则来告诉 make:
hi.o : mycoolfile.c
<recipe to build hi.o from mycoolfile.c>
由于内核构建无法知道您可能选择的源文件名,因此您必须在自己的 makefile 中编写这些规则。