所有的程序员入门的第一个程序都是从 Holle World 开始,linux嵌入式驱动开发也不例外,《Linux设备驱动程序》这本书的第一个程序就是hello world。然而,人生写驱动程序的第一次编译就异常的艰难。
以下是hello world 的程序,很简单,基本上学过C就能看懂,该程序包括两个头文件,引用了4个外部函数,内建2个函数。
1 #include <linux/init.h> 2 #include <linux/module.h> 3 4 MODULE_LICENSE("Dual BSD/GPL"); 5 6 static int hello_init(void) 7 { 8 printk(KERN_ALERT "Hello world\n"); 9 return 0; 10 } 11 12 static void hello_exit(void) 13 { 14 printk(KERN_ALERT "goodbye,cruel world\n"); 15 } 16 17 module_init(hello_init); 18 module_exit(hello_exit);
这个程序相当的清晰的指出了,驱动程序的程序结构,整个驱动程序由init函数引导加载,exit函数引导卸载。值得注意的是,驱动程序不需要main函数,这是驱动程序和普通程序一个比较明显的区别。
注:如果你使用的是老版本的书或者PDF,hello world的代码会和上述代码有所区别,建议使用上述代码,比较老版本是2.0时代的代码了(第一版是2000年左右出版的),不过书的内容并没有变化太大。
下面我们进入今天的正题。
写完这个简单的函数就可以进行编译了,然而这个时候如果你直接使用GCC编译的话你就会得到如下结果。
这里mo.c就是我的源程序文件。
可以看到这个时候编译器报错,No such file or directory,书上并没有到如何解决,只能求助于万能的度娘了。百度一圈之后,我发现,原来默认编译器就没引用这个头文件,头文件的地址就在/usr/src/linux-headers-3.16.0-30下面,于是我用-I来引用头文件,然而并不能通过。
经过一番研究我发现,网上各路大神都是使用makefile进行编译
1 obj-m := mo.o 2 3 CURRENT_DIR :=$(shell pwd) 4 5 KERNEL_DIR := /usr/src/linux-headers-$(shell uname -r) 6 all: 7 $(MAKE) -C $(KERNEL_DIR) M=$(CURRENT_DIR) modules 8 9 clean: 10 rm -rf %.o
这些总可以开开心心编译了吧,呵呵,make之后
这错误信息到底是啥意思?常识了10个小时,我终于发现
mdzz
总之makefile报错记得用权限跑一下 。。。。
时间: 2024-11-16 02:25:14