菜鸟求助:编译时提示找不到 unistd.h
发表于 : 2012-07-27 14:02
我在ubuntu 12.04下,已做了如下操作:
1. apt-get install kernel-package
2. 在 /usr/src/目录下安装 linux kernel 源码 apt-get install linux-source-3.2.0
3. 解压源码
4. 用make-kpkg 编译内核
5. 用dpkg 安装内核(deb文件)
6. 重启后版本显示是我新编译的没错
现在我想基于这个环境向内核加个模块写测试代码:
1. 在 /usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/ 下加个目录
2. 在新加的目录里加个 C 文件(测试代码,我想试一下 fork() 创建进程)
#include <linux/module.h>
#include <linux/init.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
MODULE_LICENSE("GPL");
static int guardhost_init(void);
static void guardhost_exit(void);
int main(void)
{
pid_t pc;
pc = fork();
if (pc < 0)
{
printk("guardhost: failed to create process!\n");
exit(1);
}
else if (pc > 0)
{
printk("guardhost: in parent process!\n");
}
else
{
printk("guardhost: in child process!\n");
}
return 0;
}
static int guardhost_init(void)
{
printk("guardhost_init called!\n");
return 0;
}
static void guardhost_exit(void)
{
printk("guardhost_exit called!\n");
}
module_init(guardhost_init);
module_exit(guardhost_exit);
3. 在新加的目录里加个Makefile
obj-m :=guardhost.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
4. cd 到测试代码所在目录,make,出错如下:
make -C /lib/modules/3.2.19rock.001/build M=/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost modules
make[1]: 正在进入目录 `/usr/src/linux-source-3.2.0/linux-source-3.2.0'
CC [M] /usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost/guardhost.o
/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost/guardhost.c:3:20: 致命错误: unistd.h:没有那个文件或目录
编译中断。
make[2]: *** [/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost/guardhost.o] 错误 1
make[1]: *** [_module_/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost] 错误 2
make[1]:正在离开目录 `/usr/src/linux-source-3.2.0/linux-source-3.2.0'
make: *** [all] 错误 2
root@rock-virtual-machine:/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost#
提示找不到 unistd.h这个头文件,这个头文件不是内核自带的? 还需要什么库呢? 搜索整个内核代码,没见到哪里调用 fork() 函数的,fork() 不是用来创建进程的么,怎么会头文件找不到,也没见其它地方调用啊,怪异!!! 请高手帮忙解答一下吧,谢了!
1. apt-get install kernel-package
2. 在 /usr/src/目录下安装 linux kernel 源码 apt-get install linux-source-3.2.0
3. 解压源码
4. 用make-kpkg 编译内核
5. 用dpkg 安装内核(deb文件)
6. 重启后版本显示是我新编译的没错
现在我想基于这个环境向内核加个模块写测试代码:
1. 在 /usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/ 下加个目录
2. 在新加的目录里加个 C 文件(测试代码,我想试一下 fork() 创建进程)
#include <linux/module.h>
#include <linux/init.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
MODULE_LICENSE("GPL");
static int guardhost_init(void);
static void guardhost_exit(void);
int main(void)
{
pid_t pc;
pc = fork();
if (pc < 0)
{
printk("guardhost: failed to create process!\n");
exit(1);
}
else if (pc > 0)
{
printk("guardhost: in parent process!\n");
}
else
{
printk("guardhost: in child process!\n");
}
return 0;
}
static int guardhost_init(void)
{
printk("guardhost_init called!\n");
return 0;
}
static void guardhost_exit(void)
{
printk("guardhost_exit called!\n");
}
module_init(guardhost_init);
module_exit(guardhost_exit);
3. 在新加的目录里加个Makefile
obj-m :=guardhost.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
4. cd 到测试代码所在目录,make,出错如下:
make -C /lib/modules/3.2.19rock.001/build M=/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost modules
make[1]: 正在进入目录 `/usr/src/linux-source-3.2.0/linux-source-3.2.0'
CC [M] /usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost/guardhost.o
/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost/guardhost.c:3:20: 致命错误: unistd.h:没有那个文件或目录
编译中断。
make[2]: *** [/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost/guardhost.o] 错误 1
make[1]: *** [_module_/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost] 错误 2
make[1]:正在离开目录 `/usr/src/linux-source-3.2.0/linux-source-3.2.0'
make: *** [all] 错误 2
root@rock-virtual-machine:/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost#
提示找不到 unistd.h这个头文件,这个头文件不是内核自带的? 还需要什么库呢? 搜索整个内核代码,没见到哪里调用 fork() 函数的,fork() 不是用来创建进程的么,怎么会头文件找不到,也没见其它地方调用啊,怪异!!! 请高手帮忙解答一下吧,谢了!