菜鸟求助:编译时提示找不到 unistd.h

内核编译和嵌入式产品的设计与开发
回复
hopstone
帖子: 13
注册时间: 2012-07-21 21:13

菜鸟求助:编译时提示找不到 unistd.h

#1

帖子 hopstone »

我在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() 不是用来创建进程的么,怎么会头文件找不到,也没见其它地方调用啊,怪异!!! 请高手帮忙解答一下吧,谢了!
hopstone
帖子: 13
注册时间: 2012-07-21 21:13

Re: 菜鸟求助:编译时提示找不到 unistd.h

#2

帖子 hopstone »

难道大家都没碰到过这个问题么,还是说我的环境有问题?
hopstone
帖子: 13
注册时间: 2012-07-21 21:13

Re: 菜鸟求助:编译时提示找不到 unistd.h

#3

帖子 hopstone »

是需要装什么库么,不使用fork()函数及那两个头文件时,编译没问题。。。
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 菜鸟求助:编译时提示找不到 unistd.h

#4

帖子 枫叶饭团 »

经常找不到头文件,要指定这指定那的。。。
头像
icelee123
帖子: 811
注册时间: 2011-07-16 19:48
系统: Arch

Re: 菜鸟求助:编译时提示找不到 unistd.h

#5

帖子 icelee123 »

我的做法一般是locate一下 然后直接扔到/usr/lib里 :em06
其实我是菜鸟、、、
hopstone
帖子: 13
注册时间: 2012-07-21 21:13

Re: 菜鸟求助:编译时提示找不到 unistd.h

#6

帖子 hopstone »

有网友解释说是fork()函数属于应用层的API,不能在内核层使用,所以也就无法包含相应的头文件。我估计是这样原因,准备装个QT的库,在QT环境下试试看,谢谢各位的回复和无私的帮助啊,希望我的问题,也能给碰到同样问题的跟我一样的新手们一点帮助,大家一起努力!
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 菜鸟求助:编译时提示找不到 unistd.h

#7

帖子 YeLee »

可有可无的东西,这个有必要吗?只拿需要的就可以了。另,glbc的开发包装全了吗?unicode版的?
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
pleasure21cn
帖子: 3
注册时间: 2010-06-04 9:46

Re: 菜鸟求助:编译时提示找不到 unistd.h

#8

帖子 pleasure21cn »

我在未使用新的内核前都可以正确使用,编译新的内核安装后,编译我自己的程序,提示需要线程库。
不知道有好的解决方法了
回复