2013-10-11 107 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之前它已經存在。 –