makefile文件的编写

来源:互联网 发布:php referer 编辑:程序博客网 时间:2024/05/21 22:43
  上次讲座的时候帮所有人已经调试通过了,下来了还是有很多人说他们的编译还是报错了。 对于我们这些编惯了程序的人来说,Makefile文件是不好写,脚本的很多规则跟程序是不一样的,不能多一个空格,该写tab的地方不能用空格代替.....我总结了以下,编译错误都是因为Makefile文件书写不对。现在我把比较常见的错误整理出来,如果你回去编译了还是不通过,先来对照对照是不是这个错误。首先贴出我的Makefile。
#makefile file                                                                                                                                         obj-m := kernelhello.o                          #编译为模块CURRENT_PATH:=$(shell pwd)                      #当前工作路径LINUX_KERNEL:=$(shell uname -r)                 #内核的版本信息LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)               all:                                                                            make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules          #编译模块clean:        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean            #清除模块~                                                                                  

   首先是obj-m这个里边不能有空格不能有空格不能有空格(说三遍),后边:=这是一个赋值符号,之间也不能有空格,#后边跟的是注释。obj-m := kernelhello.o里边的kernelhello跟你自己写的.c文件的名称一致。CURRENT_PATH是变量名称,如果没有自信可以一次输入正确就自己换一个名字,之前帮大家编译的时候有一半人都是这个打错了编译不过,包括后边的LINUX_KERNEL_PATH以及LINUX_KERNEL,只要保持自己的变量名称前后一致就行。
    接下来说说$(shell pwd)(和下边的$(shell uname -r)的类似不再一一赘述),和$和()之间不能有空格不能有空额不能有空格(说三遍),这时脚本的规范,有了空格编译不过。
    下边该说/usr/src/linux-headers-$(shell uname -r)是指ununtu下的源码所在文件路径,如果你的系统不是ubuntu,那么你可能跟我写的路径不一样。想知道你的路径是什么就在你的终端下敲这行命令查看:cd /usr/src里边有可能存的是一个kernel目录文件,有可能是linux-headers-XXX,如果是后一种那么你的写法跟我的一样;如果是前一种你就应该改成你的路径,写法应该是/usr/src/kernel/$(shell uname -r),还有那么一小部分的可能你的uname -r执行的结果跟你的src目录下的内核版本不一样,他会提示/usr/src/linux-headers-XXX文件不存在,如果你再三检查过了不是打错了,这样就是你的版本不对了。那么你就把自己的路径写死或者去下载一个跟你的版本一样的源码放在这个目录下就可以解决了,就写成/usr/src/linux-headers-XXX(后边就把不要写那么shell那个了,XXX是你自己那么文件夹下的内核版本号码)。
     all:下来这一行的make前边是一个tab(tab就是你键盘q左边的那个键),make后边的-C的C是大写。M=XXX等号和XXX之间不能有空格,多了空格就会报错。modules记得写对。
如果你make了以后,报错了,仔细看看是那里出错了,错误会有错误提示的,比如说什么all:没有什么可以做的。。那就是你    all:后边写错了,再仔细看看。
     all这行(clean这行类似)里边那个M=后边不能有空格,M前面一定要写上空格,因为这个前面写的是一个路径,如果没有空格系统会认为M也是路径里边的,就会报错说没有这个目录或者文件。
     最后还有内核里边不能写printf函数,写惯了C程序的人很容易顺手就打成了printf。
    后来慢慢遇到的问题不一样,后期还会继续完善本博文。

0 0
原创粉丝点击