我正在阅读FreeBSD设备驱动程序书。 第一个例子是hello.c。但是,当我编译它时,它说hello.c:1:10:致命错误:'sys / param.h'文件未找到
的hello.c
#include <sys/param.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/systm.h>
static int
hello_modevent(module_t mod __unused, int event, void *arg __unused)
{
int error = 0;
switch (event)
{
case MOD_LOAD:
uprintf("Hello, world\n");
case MOD_UNLOAD:
uprintf("GoodBye, cruel world");
default:
error = EOPNETSUPP;
}
return (error);
}
static moduledata_t hello_mod = {
"hello",
hello_modevent,
NULL
}
DECLARE_MODULE(hello, hello_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
生成文件
KMOD= hello
SRCS= hello.c
.include <bsd.kmod.mk>
uname -a FreeBSD FreeBSD-1 10.0-RELEASE FreeBSD 10.0-RELEASE#0 r260789:Fri Jan 17 01:46:25 UTC 2014 root@snap.freebsd.org:/ usr / obj / usr / src / sys / GENERIC i386
非常感谢你。 添加:
After I type make, the problem is
Warning: Object directory not changed from original /usr/home/user/Workplaces/hello
cc -O2 -pipe -fno-strict-aliasing -Werror -D_KERNEL -DKLD_MODULE -nostdinc -I. -I@ -I@/contrib/altq -fno-common -mno-aes -mno-avx -mno-mmx -mno-sse -msoft-float -ffreestanding -fstack-protector -std=iso9899:1999 -Qunused-arguments -fstack-protector -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wundef -Wno-pointer-sign -fformat-extensions -Wmissing-include-dirs -fdiagnostics-show-option -Wno-error-tautological-compare -Wno-error-empty-body -Wno-error-parentheses-equality -c hello.c
hello.c:1:10: fatal error: 'sys/param.h' file not found
#include <sys/param.h>
^
1 error generated.
*** Error code 1
答案 0 :(得分:0)
如果要构建模块,则需要安装内核源代码。
此外,您的代码有一些错误:
> make
Warning: Object directory not changed from original /home/rsmith/tmp/src/foo
cc -O2 -pipe -fno-strict-aliasing -Werror -D_KERNEL -DKLD_MODULE -nostdinc -I. -I@ -I@/contrib/altq -fno-common -fno-omit-frame-pointer -mno-aes -mno-avx -mcmodel=kernel -mno-red-zone -mno-mmx -mno-sse -msoft-float -fno-asynchronous-unwind-tables -ffreestanding -fstack-protector -std=iso9899:1999 -Qunused-arguments -fstack-protector -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wundef -Wno-pointer-sign -fformat-extensions -Wmissing-include-dirs -fdiagnostics-show-option -Wno-error-tautological-compare -Wno-error-empty-body -Wno-error-parentheses-equality -c hello.c
hello.c:17:22: error: use of undeclared identifier 'EOPNETSUPP'
error = EOPNETSUPP;
^
hello.c:27:2: error: expected ';' after top level declarator
}
^
;
2 errors generated.
*** [hello.o] Error code 1
常量EOPNETSUPP
应为EOPNOTSUPP
/usr/src/sys/sys/errno.h
。
代码应如下所示:
#include <sys/param.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/errno.h>
static int
hello_modevent(module_t mod __unused, int event, void *arg __unused)
{
int error = 0;
switch (event)
{
case MOD_LOAD:
uprintf("Hello, world\n");
case MOD_UNLOAD:
uprintf("GoodBye, cruel world");
default:
error = EOPNOTSUPP;
}
return (error);
}
static moduledata_t hello_mod = {
"hello",
hello_modevent,
NULL
};
DECLARE_MODULE(hello, hello_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
这在我的机器上编译得很好,FreeBSD 9.2-RELEASE amd64
答案 1 :(得分:0)
除了重新编译内核之外,我没有改变任何东西。虽然我不知道原因,但问题已经解决了。谢谢。