2013-10-11 74 views
7

我想在最新版本的ubuntu上编译一个C程序,目的是在稍后将编译好的程序放到另一台机器上。然而,当我用gcc -o prog.c中前卫编译,我得到一个错误:“致命错误:ASM/page.h:没有这样的文件或目录”这里有头:无法在ubuntu上编译C代码。 (#include errors)

#include <stdio.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <string.h> 
#include <malloc.h> 
#include <limits.h> 
#include <signal.h> 
#include <unistd.h> 
#include <sys/uio.h> 
#include <sys/mman.h> 
#include <asm/page.h> 
#include <asm/unistd.h> 

我得到一个#include错误。它说致命的错误:asm/page.h:没有这样的文件或目录。就像我说的,我只是想编译它。有没有办法让我找到丢失的标题或什么?谢谢。

+0

你的程序打算做什么?它为什么包括所有上面的混乱?显示更多的源代码,不仅仅是'#include'指令! –

回答

4

通常情况下,asm/page.h只存在于Linux内核树中,通常在arch/<archname>/asm/page.h之下,应该只使用内核代码(或内核模块)。

stdio.hstdlib.h另一方面,不用于内核代码。 因此,您的原始源代码看起来很腥。最有可能的是,它从来不需要asm/page.h,实际上它只需要类似linux/types.h(这是内核的asm/page.h之一包含的头之一)。

4

这些头文件不会丢失,它们已被移动。 ubuntu打包程序移动了一些东西,原来位于'/ usr/include/asm'中的头文件位于'/ usr/include/asm-generic'

要修复,只需添加一个链接:

sudo ln -s /usr/include/asm-generic /usr/include/asm

......或者,也许你可能缺乏必要的构建。这在linux中编译代码很有必要。 安装建立必要的

sudo apt-get install build-essential

现在重新创建正确的链接:

sudo ln -s /usr/include/asm-generic /usr/include/asm

建立必要的应该安装在/ usr/include中/ ASM-通用文件夹中。如果您缺少这样的文件夹,请重新安装build-essentials并验证文件夹是否存在。

/usr/include/asm-generic文件夹是否存在?

它由build-essentials安装,但检查它是安装它的依赖项。

如果/ usr/include/asm-generic不存在,请尝试安装或重新安装linux-libc-dev。

这应该创建asm通用文件夹。如果这样删除旧链接并将asm重新链接到asm-generic。

+4

不仅将'asm'连接到'asm-generic'似乎非常肮脏,它无论如何也不会有帮助。在最近的Ubuntu 13.04上,虽然目录'/ usr/include/asm-generic'存在,'page.h'没有(和'build-essential'和'linux-libc-dev'安装)。 – mvp

+0

好吧,我安装了build-essentials并创建了链接,但仍然收到了完全相同的错误。/usr/include/asm-generic确实存在,但在安装build-essentials之前它已经存在。 –