【问题标题】:Linux user-space application compilation errorLinux 用户空间应用程序编译错误
【发布时间】:2012-05-10 10:07:02
【问题描述】:

我是 linux 内核/系统开发的新手。

下面是我用来编译我的应用程序的 Makefile

CROSS_COMPILE   ?=
KERNEL_DIR  ?= /usr/src/linux

CC      := $(CROSS_COMPILE)gcc
KERNEL_INCLUDE  := -I/usr/include
CFLAGS      := -W -Wall -g $(KERNEL_INCLUDE)
LDFLAGS     := -g

all: finder-drv

finder-drv: finder.o
    $(CC) $(LDFLAGS) -o $@ $^

clean:
    rm -f *.o
    rm -f finder

我收到以下错误:

/usr/include/arm-linux-gnueabi/sys/ioctl.h:22:22: fatal error: features.h: No such file or directory

我不知道为什么缺少 features.h。

这个问题是在我运行以下命令后出现的:

make headers_install INSTALL_HDR_PATH=/usr

谁能告诉我如何解决问题并在用户空间应用程序中正确链接/使用内核头文件?

【问题讨论】:

  • 为什么在你的架构是 x86 时包含来自“arm”的东西?
  • Shahbaz:我的架构是 ARM。我没有使用 ARCH 变量

标签: linux compiler-errors makefile


【解决方案1】:

不打算直接针对内核编译用户空间程序。

如果您正在编写用户空间程序,您可以针对导出的头文件进行编译,并且只使用导出的功能,例如系统调用。您可能会通过 C 库提供的代理。

如果您正在编写内核模块,您应该使用内核构建系统而不是制作自己的 makefile。

【讨论】:

  • 谢谢克里斯。我正在编写一个用户空间程序。早些时候,当我编译我的应用程序时,我遇到了一些头文件未找到的问题。所以我尝试使用 make headers_install INSTALL_HDR_PATH=/usr 将内核头文件导出到用户空间,但是在这个命令之后一切都搞砸了。以前有效的东西现在不起作用。你能建议一个补救措施吗?
  • 如果您发现缺少的标头,很可能您有一个不适合现代 linux 的程序,没有在现有包含路径中识别正确的标头,或者正在尝试使用以下功能不适用于用户空间程序。您似乎也将主机包含路径 /usr/include 与交叉工具链混合使用。您能找到一个“hello world”或任何已知可与您的目标平台工具链一起使用的演示项目吗?
  • 克里斯,除了上述问题外,一切正常。我在带有内核版本 3.1 的 pandaboard es 上使用 Ubuntu 11.04。我每天都构建内核模块,没有一个错误。实际上,我遇到问题的代码是 1 岁以上。但让我担心的是,有问题的代码中使用的头文件也在我的内核模块中使用,并且模块构建成功。在“make headers_install INSTALL_HDR_PATH=/usr”之后我遇到了问题。您能否告诉/指导我如何将内核头文件和其他内容重置为清理状态。标头重新安装/安装不起作用
  • 您在内核模块中使用的头文件不应与您在用户空间中使用的头文件重叠——它们是完全不同的执行和编程环境。一些标头在内核和用户空间中可能具有相同的名称,但应该来自不同的目录路径,因为它们在内部是不同的。您能否构建应用程序以在开发机器上运行作为测试,或者在 arm 板上实际编译,以暂时消除交叉编译的复杂性?
  • 我正在使用板作为开发机器并在其上构建应用程序。
【解决方案2】:

问题解决了。

为用户空间应用程序导出内核头文件的正确命令如下

制作 headers_install INSTALL_HDR_PATH=/usr/include

我给了/usr而不是/usr/include

我通过使用以下命令重新安装libc-dev 恢复了/usr/include 中已删除的文件

apt-get install lib6-dev --reinstall

克里斯,感谢您的宝贵时间和帮助。

【讨论】:

  • 很高兴您有解决方案。尽管除非您对内核的用户空间接口进行了独特的更改,否则您不需要重新导出标头 - 'sudo apt-get install build-essential' 应该为您提供构建基本用户空间所需的一切(工具、包含等) Ubuntu 上的应用程序。
  • Chris,这是我第一次做 Linux 系统/内核编程。所以我只是在试验和学习。
  • 你的意思是:apt-get install libc-dev --reinstall
猜你喜欢
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2011-05-30
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多