Linux 在内核中构建hello world模块时出错
执行Linux 在内核中构建hello world模块时出错,linux,linux-kernel,makefile,c,Linux,Linux Kernel,Makefile,C,执行make命令后,我得到以下错误。此错误的原因是什么?如何解决此问题 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 -make命令中的C选项指示将目录更改为-C提供的目录。在您的情况下,它是/lib/mo
make
命令后,我得到以下错误。此错误的原因是什么?如何解决此问题
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
-make命令中的C选项指示将目录更改为-C提供的目录。在您的情况下,它是/lib/modules/2.6.32-358.el6.x86_64/build。但当它试图更改到该目录时,编译会出现错误,显示“没有这样的文件或目录”,这意味着您在/lib/modules/2.6.32-358.el6.x86_64/处没有构建目录 很多时候,给定路径中的构建可能不是目录,但可能是指向内核源代码目录的软链接
因此,您需要检查在包含内核源代码的所需路径上是否应该有build目录,或者它应该是指向内核源代码的软链接。除了所有这些与构建相关的注释外,在编写内核模块时,您还需要遵循几点。即使修复了这些构建问题,代码也不会像您预期的那样工作。为什么?您已经构建了init和cleanup例程,但尚未指定/指示哪个是init例程,哪个是cleanup 你必须这样做 在文件末尾添加这两行
make -C /lib/modules/2.6.32-358.el6.x86_64/build M=/home/hello modules
make: *** /lib/modules/2.6.32-358.el6.x86_64/build: No such file or directory. Stop.
make: *** [all] Error 2
此外,您还必须指定模块许可证详细信息等,如下所示
module_init ( foo_init_fn);
module_exit ( bar_exit_fn);
您是否安装了相应的内核开发包?另外,我注意到在这里发布的makefile中,
make
命令前面有空格make
希望命令前面加上制表符。这可能根本不是你的问题,但值得修复。(这就是说,这个问题似乎更适合于堆栈溢出,因为它严格地说是关于编程问题的。)make文件中有制表符就可以了。我知道。我已经安装了kernel-devel软件包。生成目录似乎有问题。您能告诉我如何正确创建生成目录吗。我使用了命令yum-install-kernel-devel和yum-install-kernel-headers。我正在oracle虚拟机上使用cent os。您知道这一点很好,但这仍然是一个非常常见的错误,您的问题在发布时使用空格,而不是制表符。你似乎完全忽略了我评论的第一部分。当你运行ls/lib/modules/
时,你会得到什么?确保你的/lib/modules/2.6.32-358.el6.x86_64/build是否退出。如果不升级内核。如果您使用ls-l构建,它将显示到内核源代码的符号链接
module_init ( foo_init_fn);
module_exit ( bar_exit_fn);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Copyright (c) 2006 by xxxx xxxxx, Inc.");
MODULE_DESCRIPTION("klm_vdc");