歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> <linux/init.h>及<linux/module.h>頭文件不存在等問題如何解決

<linux/init.h>及<linux/module.h>頭文件不存在等問題如何解決

日期:2017/3/3 15:47:37   编辑:關於Linux

這個問題真心是處理了一個下午,還自己去下載了個最新的內核拿來編譯,其實是完全沒必要的,因為ubuntu系統是可以直接下載新內核的。

你可以在/usr/src/文件夾下找到這些內核文件夾,比如說我自己的系統:

<linux/init.h>及<linux/module.h>頭文件不存在等問題如何解決

寫博客的時候使用的是3.13.0-19的內核。

寫一個hello.c的測試文件:

 1 #include <linux/kernel.h> /*Needed by all modules*/
 2 #include <linux/module.h> /*Needed for KERN_* */
 3 #include <linux/init.h> /* Needed for the macros */
 4 
 5 MODULE_LICENSE("GPL");
 6 
 7 static int year=2014;
 8 
 9 static int hello_init(void)
10 {
11   printk(KERN_WARNING "Hello kernel, it's %d!\n",year);
12   return 0;
13 }
14 
15 
16 static void hello_exit(void)
17 {
18   printk("Bye, kernel!\n");
19 }
20 
21 /* main module function*/
22 module_init(hello_init);
23 module_exit(hello_exit);

然後用kbuild標准寫一個Makefile文件:

1 obj-m := hello.o
2 
3 all :
4     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
5     
6 clean:
7     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

obj-m := name.o表示會編譯一個模塊(-m),生成的name.o文件來自於name.c文件。

本欄目更多精彩內容:http://www.bianceng.cn/OS/Linux/

uname -r 命令返回的實際就是你現在使用的內核版本,比如說我的系統:

<linux/init.h>及<linux/module.h>頭文件不存在等問題如何解決

所以-C選項後面完整的路徑是:/lib/modules/3.13.0-19-generic/build,但是不建議給出具體的路徑,而是用$(shell uname -r)這種可變的路徑,這樣,當你在低版本內核中編譯過,拿到高版本內核中再次編譯的時候也能正常通過。

編譯完成之後能夠看到模塊文件:

$sudo insmod ./hello.ko #加載

$sudo rmmod hello #刪除 或者 sudo rmmod ./hello.ko

<linux/init.h>及<linux/module.h>頭文件不存在等問題如何解決

如果是要在Eclipse中開發也是差不多的,不過有些地方要作修改,一是項目中Path and symbol那裡似乎要添加內核的include文件夾,然後在symbol選項卡中需添加__MODULE__。

還有,要關閉當前項目的makefile自動生成功能。

如果你想要Eclipse集成環境來開發的話,選工程的時候請選Makefile project。自己寫Makefile。

其它都是差不多的,網上寫的那些亂七八糟的又復雜又報錯,真特麼是各種坑爹。

Copyright © Linux教程網 All Rights Reserved