1. */2.6.37/include/linux/types.h:13:2: warning: #warning "Attempt to use kernel headers from user space, see http://kernelnewbies.org/KernelHeaders"

     然後問我這個怎麼消除。我也是第一次注意到這個警告(以前可能有出現,可能我沒有注意吧)。然後我根據後面提供的網址,研讀了一下這份英文資料,發現這個原來是頭檔的使用不當產生的。英文資料翻譯如下:

 

內核頭文件


Linux
內核中的頭檔用於兩個目的:

 

1、定義內核元件間的介面,和

2、定義內核與用戶空間的介面

 

內部模組

 

模組間的內部介面在linux/include/ 或 linux/arch/*/include/ 下都有定義。一個單獨模組的原始檔案間的介面應該同模組源碼置於同一目錄下,避免污染全局頭檔空間。

 

外部模組

 

為了編譯外部內核模組,你需要來自該模組所針對內核的頭檔。Driver porting: compiling external modules 解釋了如何編寫一個外置的Makefile來使用這些頭檔。照此做法,內核Makefile將為源碼和編譯目錄自動選擇正確的包含路徑,並從正確的構架中使用include/asm頭檔。

 

傳統的內核源碼安裝在/usr/src/linux下,這不再支援外部模組的編譯。相反,你的Makefile應該指向/lib/modules/${kver}/build,其中${kver}是內核確切的版本字串,例如:對於當前正在運行的內核,就是“uname -r”的輸出。

用戶空間程式

 

一 般來說,用戶空間程式是針對發行版提供的頭檔編譯的,通常源於glibc-devel、glibc-kernheaders 或 linux-libc-dev。這些頭檔通常來源於舊版內核,並不能安全地在不重新編譯glibc的情況下被替換。特別地,作為一個到/usr/src /linux/include或/lib/modules/*/build/include/linux的符號鏈結/usr/include /linux,是極不推薦使用的。因為它經常使重新編譯的應用程式損壞。例如,舊內核使用include/asm-${arch}存放架構特定的頭檔, 而不是現在的arch/${arch}/include/asm ,且沒有符號鏈結到架構特定的目錄。

 

為一個發行版打包頭檔正確的方法是在內核源碼目錄下運行 'make headers_install'來安裝頭檔到/usr/include,並依賴這個剛剛安裝的特定版本的內核頭檔重新編譯C庫包。

如果你正在發佈一個依賴某個特定版本內核頭檔的用戶空間程式,比如因為你的程式只運行在打過補丁或者最新的內核上,你不能依賴/usr/include中的頭檔。你也不能使用來自/usr/src/linux/include 或/lib/modules/*/build/include/的頭檔,因為他們還沒有為用戶空間的包含做好準備。若你嘗試這麼做了,內核會警告你並指引你到這個Wiki頁解決這個問題的正確方法是獨立出你需要的特定介面,比如一個打過補丁的新 內核並為你的應用程式提供字元設備ioctl號的獨立頭檔。在你自己的程式中添加一份這個原始檔案的拷貝,並說明這個應該和新內核版本保持一致。如果你的 程式不遵循GPLv2證書,請保證你得到了這個檔作者的許可:可在你自己程式的證書下發佈它。因為你的程式現在依賴的內核介面並不在常規內核中。在這種 情況下,一個推薦的做法是通過運行時檢測來保證內核知道這個介面並在無法向下相容舊介面的時候給出有用的錯誤資訊。

 

   看了這個說明,我就明白了,我同事直接使用了內核源碼中沒有處理過的頭檔。而我一般都是使用編譯器中自動包含的頭檔,那個是通過'make headers_install'安裝的,所以一般不會出這樣的警告。

 

   後來,我讓同事使用以下的方法解決了這個警告

 

1、在內核源碼根目錄下運行: 'make headers_install',這樣內核Makefile會把提供給應用程式的頭檔提取並放在內核源碼的“usr/include”目錄下。

(請勿擔心git會發現檔增加了,usr目錄中的.gitignore檔已經讓git忽略了其下的include檔夾)

2、在編譯應用程式的時候,在GCC的CFLAG參數中添加“-I(內核源碼路徑)/usr/include”,這樣編譯器就知道在編譯時找到相關的頭檔了。

----------------------------------------------------------------------------------------------

  平時我們在編譯應用程式的時候,不可避免的會使用內核頭檔,比如v4l2,字元驅動等等。此時直接的使用內核源碼中include目錄下的頭檔,可能就會有警告。這個警告現在看來僅在"include/linux/types.h"中存在,因為這個檔中包含了很多內核自定義的類型,你的應用程式如果也做了這樣的定義就可能出現問題。此時你就應該使用內核幫你處理過的專門提供給用戶空間的頭檔,這個就是為什麼'make headers_install'會將頭檔(默認)放在usr(用戶)目錄下的原因。

 

  關於這個頭文件的問題,其實是有一段歷史故事的:《內核頭文件傳奇》。挺有意思的,大家看過後就知道內核頭檔的使用為什麼是這樣了。

 

http://blog.chinaunix.net/uid-25150360-id-3202945.html

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()