【问题标题】:Compilation issue on new kernel新内核的编译问题
【发布时间】:2015-11-02 00:08:46
【问题描述】:

我已经安装了 Fedora 22,它具有默认内核 4.0.4。 但是我需要内核 4.1.4,所以我在 Fedora 22 上安装了内核 4.1.4。并在 grub 中为新内核创建条目。

内核 4.1.4 安装成功,我可以使用新内核登录。

“uname -a”的输出-

uname -a
Linux localhost.localdomain 4.1.4 #1 SMP Fri Aug 7 10:52:36 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux

新内核的路径 -

/usr/src/linux-4.1.4

包含文件夹的路径 -

/usr/src/linux-4.1.4/include

现在我编写了一个 C 程序,它使用了在新内核头文件中定义的宏 AF_MPLS。 c程序编译失败,因为AF_MPLS不在/usr/include/sys/socket.h中。

发现错误 -

RouteMPLS.c: In function âroute_addâ:
RouteMPLS.c:212:24: error: âAF_MPLSâ undeclared (first use in this function)
req.r.rtm_family = AF_MPLS;

RouteMPLS.c 中使用的头文件

#include <stdio.h>
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>

所以,我将头文件 a/c 的位置更改为新内核-

#include "/usr/src/linux-4.1.4/include/linux/socket.h"

仍然会引发编译错误,然后我尝试使用

gcc RouteMPLS.c -I /usr/src/linux-4.1.4/include/
In file included from /usr/src/linux-4.1.4/include/linux/kernel.h:6:0,
             from /usr/src/linux-4.1.4/include/linux/skbuff.h:17,
             from /usr/src/linux-4.1.4/include/linux/netlink.h:6,
             from RouteMPLS.c:3:
/usr/src/linux-4.1.4/include/linux/linkage.h:7:25: fatal error: asm/linkage.h: No such file or directory

编译终止。

请指导我如何使用新的内核头文件安装我们的 c 程序 -

默认内核头文件位置 -

/usr/include

新内核头位置 -

/usr/src/linux-4.1.4/include

提前致谢。

【问题讨论】:

  • 你记得安装内核头文件吗?
  • 我从源代码安装了新的 kernel-4.1.4 -
  • 这不能回答问题。安装接头是一个独立的步骤。
  • 需要单独安装内核头文件吗?
  • 你的内核编译教程是怎么说的?

标签: c linux linux-kernel


【解决方案1】:

问题是你的内核编译目录中有linux kernel 4.1.4的头文件。

为了编译用户程序,编译器通常会在/usr/include 中查找它们(好吧,在新架构中,它会更复杂一些)并且通常会在/usr/include 中安装运行内核的内核头文件副本

但是现在,您的内核头文件版本不匹配。你没有说你从哪里下载了这些源代码,但是在内核源代码树的Documentation 子目录中,你有一些文档解释了如何在适当的位置安装内核头文件,因此系统应用程序的编译器可以找到它们对。

阅读/usr/src/linux-4.1.4/Documentation 的文档以获取解释如何在适当位置安装内核头文件的文件。主要是指安装在/usr/include/linux/usr/include/asm/usr/include/asm-amd64下的所有文件。

注意:

在内核源代码树中进行一些搜索后,我在 Makefile 中找到了一个目标 headers_install(通过尝试 make help)我想用于将内核树中的头文件安装到正确的位置。

所以,安装内核头文件最可能的方法是:

make headers_install

或(如果您必须将它们安装在其他地方)

INSTALL_HDR_PATH=<new_path> make headers_install

(它说默认安装到./usr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2014-09-26
    相关资源
    最近更新 更多