C 使用较新的编译器编译linux 2.6内核模块

C 使用较新的编译器编译linux 2.6内核模块,c,gcc,linux-kernel,C,Gcc,Linux Kernel,我构建了运行RT_PREMPT版本Linux的嵌入式机器。这是一个运行Linux 2.6内核的Ubuntu 10.04安装。是的,这是一个旧的内核,但我已经用了一段时间了 在编译内核时,我使用了gcc版本4.4。在这个系统上,有一个内核模块我已经成功编译了三年 从我的Makefile all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) \ modules 我当前的项目需要对c++14的支持,因此我通过从源代码构建将gc

我构建了运行RT_PREMPT版本Linux的嵌入式机器。这是一个运行Linux 2.6内核的Ubuntu 10.04安装。是的,这是一个旧的内核,但我已经用了一段时间了

在编译内核时,我使用了gcc版本4.4。在这个系统上,有一个内核模块我已经成功编译了三年

从我的Makefile

all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) \
    modules
我当前的项目需要对c++14的支持,因此我通过从源代码构建将gcc和g++更新为5.1.0版。我的所有用户模式软件都可以编译,但当我开始构建内核模块的更新版本时,我立即遇到以下错误:

make[1]: Entering directory `/usr/src/linux-headers-2.6.32-54-generic'
  CC [M]  /home/tbj/srcroot/ctsengine-hg/CtsRt/ctsrt_main.o
In file included from include/linux/compiler.h:40:0,
             from include/linux/stddef.h:4,
             from include/linux/list.h:4,
             from include/linux/module.h:9,
             from /home/tbj/srcroot/ctsengine-hg/CtsRt/ctsrt_main.c:31:
include/linux/compiler-gcc.h:86:30: fatal error: linux/compiler-gcc5.h: No such file or directory
简言之:

fatal error: linux/compiler-gcc5.h: No such file or directory
如果我再次使用GCC4.4(我将它安装在我的计算机上的另一个目录中),它的编译和运行将非常完美

显然,我遗漏了一些东西。不可能用比操作系统编译时使用的编译器版本更新的编译器编译内核模块吗?对我来说,这似乎不太可能。是否缺少配置步骤?是否有需要更新的系统变量?我应该下载额外的头文件吗?我倾向于更新build essential,但它是最新的。我在我的系统上有内核的源代码和头文件。我不确定还能下载什么


对此问题的任何见解都将不胜感激。提前感谢。

您的内核版本太旧,已丢失

标头包含在中,其名称由预处理器宏根据当前编译器版本生成:

#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
此标题是围绕
3.18版推出的


您可以尝试从较新的内核源获取此文件,并将其放入
include/linux

打开终端并键入:

$ ls -r /usr/src/linux-headers-$(uname -r)/include/linux/ | \
  grep -P "compiler-gcc\d.h" | \
  head -n 1
这将有望输出适合您的linux内核的最新gcc头

在我的例子中,它是
compiler-gcc4.h
。现在,您可以通过以下方式将此文件链接到
compiler-gcc5.h

$ sudo ln -s /usr/src/linux-headers-$(uname -r)/include/linux/compiler-gcc4.h \
             /usr/src/linux-headers-$(uname -r)/include/linux/compiler-gcc5.h

向上投票,但我猜将compiler-gcc4.h复制到compiler-gcc5.h也值得一试。从这里抓取它:raw.githubusercontent.com/torvalds/linux/master/include/linux/compiler-gcc5.h并将其复制到内核的headers目录中。解决了问题;谢谢@很显然,你是对的。或者
echo“#include”>include/linux/compiler-gcc5.h
。嘿,伙计们,我真的需要一些帮助。我正在尝试编译Linux2.6.31。我希望
compiler-gcc6.h
我尝试将gcc5复制到gcc6.h不起作用。最终导致一系列错误。还有其他建议吗?@gideon这取决于你收到的错误。我建议你问一个新问题,提供更多细节。