Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在内核中构建hello world模块时出错_Linux_Linux Kernel_Makefile_C - Fatal编程技术网

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");