致命错误:linux/compiler-gcc7.h:没有此文件或目录

致命错误:linux/compiler-gcc7.h:没有此文件或目录

我正在尝试安装Atheros CSI 工具(提供安装说明这里),在配备 QCA9377 无线适配器的 Dell Inspiron 5570 笔记本电脑上运行 Ubuntu 18.04.2 LTS。

我可以成功完成安装说明中“编译内核”的“准备”部分列出的所有操作。(有些操作说明中没有指定,但我能够弄清楚如何操作,例如安装makegcc。)但是,我对步骤和后续步骤感到困惑make menuconfig。当我输入make menuconfigAtheros-CSI-Tool 文件夹时,我立即按“保存”,保存名为 的文件.config,然后“退出”菜单。

当我输入make -j16(我有 8 个 CPU 核心)时,输出如下:

  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CC      scripts/mod/empty.o
  CC      scripts/mod/devicetable-offsets.s
cc1: error: code model kernel does not support PIC mode
cc1: error: code model kernel does not support PIC mode
scripts/Makefile.build:258: recipe for target 'scripts/mod/empty.o' failed
make[2]: *** [scripts/mod/empty.o] Error 1
make[2]: *** Waiting for unfinished jobs....
scripts/Makefile.build:153: recipe for target 'scripts/mod/devicetable-offsets.s' failed
make[2]: *** [scripts/mod/devicetable-offsets.s] Error 1
scripts/Makefile.build:403: recipe for target 'scripts/mod' failed
make[1]: *** [scripts/mod] Error 2
make[1]: *** Waiting for unfinished jobs....
Makefile:555: recipe for target 'scripts' failed
make: *** [scripts] Error 2
make: *** Waiting for unfinished jobs....
make: *** wait: No child processes.  Stop.

当我输入时make modules,这是输出:

  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CC      arch/x86/purgatory/purgatory.o
In file included from include/linux/compiler.h:54:0,
                 from include/uapi/linux/stddef.h:1,
                 from include/linux/stddef.h:4,
                 from ./include/uapi/linux/posix_types.h:4,
                 from include/uapi/linux/types.h:13,
                 from include/linux/types.h:5,
                 from arch/x86/purgatory/sha256.h:14,
                 from arch/x86/purgatory/purgatory.c:13:
include/linux/compiler-gcc.h:121:1: fatal error: linux/compiler-gcc7.h: No such file or directory
 #include gcc_header(__GNUC__)
 ^~~~
compilation terminated.
scripts/Makefile.build:258: recipe for target 'arch/x86/purgatory/purgatory.o' failed
make[1]: *** [arch/x86/purgatory/purgatory.o] Error 1
arch/x86/Makefile:185: recipe for target 'archprepare' failed
make: *** [archprepare] Error 2

我尝试通过从档案库安装旧版本的 Ubuntu (14.04) 来修复遇到的这些错误,但在该操作系统下,我的笔记本电脑上的 Wi-Fi 无法使用(这很重要,因为我正在使用尝试安装的工具收集有关 Wi-Fi 连接的数据)。我还从在线档案库安装了一个旧的 Linux 内核 (4.1.10),但遇到了与上述相同的错误。

答案1

这里有两个问题:

  1. 内核不支持 PIC 模式编译,详情可参见此处邮政。正如@Joy 所说,目前 apt 安装的 gcc5+ 默认启用了 PIE,我们需要将其添加-fno-pie到 gcc 选项中。

    我在这里关注Makefile修复,从您克隆的 git repo 下的L774 开始添加以下行。

    # force no-pie for distro compilers that enable pie by default
    KBUILD_CFLAGS += $(call cc-option, -fno-pie)
    KBUILD_CFLAGS += $(call cc-option, -no-pie)
    KBUILD_AFLAGS += $(call cc-option, -fno-pie)
    KBUILD_AFLAGS += $(call cc-option, -no-pie)
    
    # optional, mute warnings on pointers signedness to speed up compilation
    KBUILD_CFLAGS += $(call cc-option, -Wno-pointer-sign)
    
  2. include/linux/compiler-gcc.h:121:1: fatal error: linux/compiler-gcc7.h,这基本上说明在您克隆的 git repo 文件夹下include/linux,没有名为 的文件compiler-gcc7.h。当前该文件夹下仅存在compiler-gcc5.h。因此,一种直接的方法是安装并暂时选择gcc-5作为默认编译器。以下:

    # install gcc-5
    sudo apt-get install gcc-5
    
    # use update-alternatives to switch default gcc version
    # register gcc-7
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 60
    
    # choose gcc-5 at prompt
    update-alternatives --config gcc
    
    # now check gcc version, verify is using gcc-5
    gcc -v
    
    ## gcc version 5.5.0 20171010 (Ubuntu 5.5.0-12ubuntu1)
    

安装说明指出libnl-dev通过以下方式安装

sudo apt-get install libnl-dev

libnl-dev似乎在 18.04 中不再存在。考虑使用

sudo apt-get install libnl-3-dev

如果你遇到了麻烦。

gcc-7最后,你可以在安装后通过以下方式切换回

# choose gcc-7 at prompt
update-alternatives --config gcc

答案2

使固定:

  1. 在你的项目中找到“linux/compiler-gcc*.h”,“*”可能是 3 或 5 或其他
  2. cp “linux/compiler-gcc*.h” “linux/compiler-gcc7.h”。

相关内容