【问题标题】:FreeBSD Kmod Cannot find sys/param.hFreeBSD Kmod 找不到 sys/param.h
【发布时间】:2014-03-01 09:51:15
【问题描述】:

我正在阅读 FreeBSD 设备驱动程序一书。 第一个例子是 hello.c。但是,当我编译它时,它说 hello.c:1:10: fatal error: 'sys/param.h' file not found

你好.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:2014 年 1 月 17 日星期五 01:46:25 UTC 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

【问题讨论】:

    标签: c kernel freebsd


    【解决方案1】:

    如果你想构建模块,你需要安装内核源代码。

    另外,您的代码有一些错误:

    > 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 应该是来自/usr/src/sys/sys/errno.hEOPNOTSUPP

    代码应如下所示:

    #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

    【讨论】:

    • 感谢您纠正我的错字。实际上,一个 hello.c:1:10: fatal error: 'sys/param.h' file not found #include ^ 1 产生错误。 *** 错误代码 1 停止。
    • 问题是 make 找不到我的 .h 文件。我正在使用 FreeBSD 10 32 位。
    • @user1111073 你确定你已经安装了 FreeBSD 源代码吗?您需要它来构建模块。它应该在目录/usr/src
    【解决方案2】:

    除了重新编译内核之外,我没有改变任何东西。问题已经解决,虽然我不知道原因。谢谢。

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 2018-02-18
      • 2017-06-26
      • 2012-01-05
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 2015-07-21
      • 2021-07-20
      相关资源
      最近更新 更多