LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: marvel

helloworld的module出现问题

[复制链接]
 楼主| 发表于 2006-1-1 18:06:43 | 显示全部楼层
我现在的格式都是安装你的写的,基于2.6的:
hello.c
      1 #include <linux/init.h>
      2 #include <linux/module.h>
      3 #include <linux/kernel.h>
      4
      5 MODULE_LICENSE("GPL");
      6
      7 static int hello_init(void)
      8 {
      9     printk("Hello,world!Init\n");
     10     return 0;
     11 }
     12
     13 static void hello_exit(void)
     14 {
     15     printk("Good Bye!Exit!\n");
     16 }
     17
     18 module_init(hello_init);
     19 module_exit(hello_exit);


Makefile:
      1 obj-m += hello.o
      2
      3 default:
      4     make -C /lib/modules/$(shell uname -r)/build/ SUBDIRS=$(PWD) modules      5
      6 clean:
      7     rm -f .*.cmd *.mod.c *.o *.ko -r .tmp*

现在问题处在linux/autoconf.h这个文件在内核包找不到。(奇怪的是在/usr/include/linux/autoconf.h却存在),这个文件不存在导致编译不过去
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-1 18:17:09 | 显示全部楼层
现在的include关系是hello.c <=linux/config.h <= linux/autoconf.h
但是autoconf.h却不存在

那么对于程序中的#include <linux/init.h>,编译是是指/usr/include/linux/init.h还是指/usr/src/linux/include/linux/init.h?
还有,对于2.6内核,是不是需要先将内核编译一下,然后再编译模块?
回复 支持 反对

使用道具 举报

发表于 2006-1-1 18:24:51 | 显示全部楼层
Post by marvel
现在的include关系是hello.c <=linux/config.h <= linux/autoconf.h
但是autoconf.h却不存在

安装内核包的头文件。
linux-kernel-headers,安装对应你的内核版本的包。
Post by marvel

那么对于程序中的#include <linux/init.h>,编译是是指/usr/include/linux/init.h还是指/usr/src/linux/include/linux/init.h?

/usr/include/linux/init.h(我认为,不确定)
Post by marvel

还有,对于2.6内核,是不是需要先将内核编译一下,然后再编译模块?


debian下对于2.6的核不需要的,好象在内核包中已经带了编译需要的代码树。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-1 18:38:44 | 显示全部楼层
我用的是2.6.15自己编译的内核,怎么获得linux-kernel-headers呢?
回复 支持 反对

使用道具 举报

发表于 2006-1-1 19:24:44 | 显示全部楼层
Post by marvel
我用的是2.6.15自己编译的内核,怎么获得linux-kernel-headers呢?


如果是那样,你编译内核后,执行安装了吧?
如果不行,随便装了一个linux-kernel-header试一试吧。(如,2.6.12)
这儿也不是非常确定。呵呵。自己试试吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-1 20:13:36 | 显示全部楼层
我明白了autoconf.h是编译内核时候自动添加上去的.
此外,编译和build模块的时候还需要/usr/src/linux的script下的一些可执行文件,这些文件也是编译内核完毕生成的.
所以无论如何,内核一定是要编译的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-1 20:49:27 | 显示全部楼层
搞定了!原来还是需要编译内核的!

刚才我提到的那个init.h其实就是/usr/src/linux/include/linux下的.
autoconf.h找不到是因为这个文件是在编译内核的时候生成的.
此外,还需要script目录下的一些可执行文件,这也是编译内核时候完成的
回复 支持 反对

使用道具 举报

发表于 2006-1-1 23:19:27 | 显示全部楼层
如果内核是你自己编译安装的话,这些问题都是可以避免的
make menuconfig (或者config, gconfig, xconfig, oldconfg, defconfig......)
都会帮你建立 include/linux/autoconf.h
make modules_install
会帮你建立好那个符号连接

学习内核编程
最好是使用自己编译,安装的内核
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-2 09:30:21 | 显示全部楼层
...
原来是这样。
原来我编译完内核,发现中间文件实在占的空间太大,所以把整个目录全部删掉了,只留下config文件。看来以后编译完就运行make clean就行了
回复 支持 反对

使用道具 举报

发表于 2006-1-2 11:33:18 | 显示全部楼层
我个人习惯是保留那些文件
几百M而已,一部电影还上G呢
因为如果以后对这个内核的配置稍作改动
之后再make时
只需要编译增加的部分就够了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表