首頁  >  問答  >  主體

c - linux内核编程找不到头文件

学校的操作系统课程设计, Ubuntu14.04升级新内核并从新内核启动(4.2.6stable)
后来要求编写一个字符设备驱动, 代码里面

#include<sys/stat.h>
#include<sys/types.h>
. . . 

结果make的时候提示找不到这些头, 我的makefile里面定义的KDIR是/lib/include/4.2.6/build

驱动代码和makefile都是参照网上的例程的, 以前没有内核开发经验

我自己尝试find types.h头, 后来发现它的上一级目录并不是sys, 有人能详细解说一下么
包括-generic源码里面也没有这样的目录结构

编译完新内核相应的内核树不是也已经建立好了么, 为什么目录结构不一样呢

我的makefile(参照《Linux设备驱动》里面的)

# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
    obj-m := char_dev.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
    #INCLUDE ?= /usr/src/linux-4.2.6/include/linux
    KERNELDIR ?= /lib/modules/3.13.0-24-generic/build
    #/usr/include/x86_64-linux-gnu/
    #/usr/src/linux-4.2.6/include/linux
    PWD := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

包含的几个头如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>


#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include <linux/wait.h>
#include <linux/semaphore.h>
ringa_leeringa_lee2713 天前611

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-17 13:55:01

    你的描述可能要再詳細一點,讓更多的人可以診斷你的問題。

    在Ubuntu上編譯內核,建議使用下面兩種簡單的方法:
    第一種:從kernel.org下載源碼,但使用Ubuntu的相關工具包進行編譯:可以參考連結:https:// wiki.ubuntu.com/KernelTeam/GitKernelBuild

    第二種:使用Ubuntu官方封裝的kernel源碼及工具包,它是在kernel.org源碼的基礎上,加了補丁,以及各種Ubuntu自己的包配置,可以參考鏈接:https:// wiki.ubuntu.com/Kernel/BuildYourOwnKernel

    使用以上方法都可以簡單的把新編譯的核心應用到系統上,同時也幫你裝好內核頭文件,在/usr/src/linux-headers-xxx,你直接以新核心啟動進入系統,就可以開始驅動開發了,頭檔自動能找到。

    書上說的方法,不一定是採用了以上的方法。書上介紹的,通常都是原生的方法,一般是直接使用kernel.org上的源碼,依據kernel.org的文檔介紹的方法進行手工操作的,但要注意,kernel源碼你自己下載到本地任何位置編譯,但記得把kernel頭檔安裝到系統目錄上,可以使用指令:

    make headers_install

    一般也會安裝到/usr/src/下,然後切換到新核心的系統,直接就可以進行驅動開發了,不用配置什麼頭檔路徑。

    所以你要確定你目前的系統已經安裝了核心頭檔。假設你沒明白這個,我建議你使用另一個簡單方法:完整的Linux kernel代碼裡,就已經包含了驅動的編譯,把你自己的驅動代碼,替換源碼對應的驅動的目錄下的文件,直接編譯模組,也能編譯,效果是一樣的。也可以新增新的驅動檔進去,稍微修改一下相關的MakeFile也能達到目的。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:55:01

    樓主需要的頭文件地址在/usr/include/sys/
    如果是驅動需要的頭文件/usr/src/linux-headers-xxxxx/include/linux/ (xxxx是你的Kernel版本號)

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:55:01

    樓主是否知道頭檔的目錄,簡單一點可以直接在編譯的時候指定搜尋目錄 -I

    回覆
    0
  • 取消回覆