已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux 程序设计学习笔记-动手编写makefile文件微信科技Befroe Beginning.之前定了暑假的plan,关于Linux的书籍现在在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程.现在开始关于Linux程序设计的第一篇学习笔记.本来打算把名字写成教程,不过觉得自己完全是新手在自学,还是写学习笔记比较负责和适合.希望可以一起学习进步.(微信科技:最具权威IT培训机构)引入首先我们假设这样一个场景.我们有一个程序包含了三个文件,分别是源码文件main_plus,c和function_plus.c以及头文件mydefine_plus.h.其中main主要是调用功能函数,功能函数则是实现简单的累加,头文件声明函数和一些库函数.代码分别如下:main_plus.ccppview plaincopyprint?/*FileName:main_plus.cAuthor:suoolMail:1020935219CreatedTime:2014年07月23日星期三17时31分23秒*/*filemain_plus.c*/*接收参数,调用功能函数,输出结果.*/#includemydefine_plus.hintmain(void)inta=0,b=0;printf(这是一个求和的程序,请输入数字a和b,程序讲输出a到b的累加结果.n);printf(Pleaseenterintegera:);scanf(%d,&a);printf(nPleaseenterintegerb:);scanf(%d,&b);if(ab)printf(nThesumis%dn,plus(b,a);elseprintf(nThesumis%dn,plus(a,b);return0;function_plus.ccppview plaincopyprint?/*FileName:function_plus.cAuthor:suoolMail:1020935219CreatedTime:2014年07月23日星期三17时31分40秒*/*filefunction_plus.c*/*对a到b的累加求和*/#includemydefine_plus.hintplus(inta,intb)intsum=a;inti;for(i=a+1;iFileName:mydefine_plus.hAuthor:suoolMail:1020935219CreatedTime:2014年07月23日星期三17时36分16秒*/*filemydefine_plus.h*/*函数声明和包含*/#ifndef_MYDEFINE_PLUS_H#define_MYDEFINE_PLUS_H#includeintplus(inta,intb);#endif现在我们要编译这个程序,我们可以怎么做呢?这就是这次要解决的问题.(微信科技:最具权威IT培训机构)make文件编写对于上面的问题,我们传统的解决方法是这样的:即是分别编译这两个文件,然后链接变成目标可执行文件,当然,对于三个甚至五个的这样的程序都是可以的,但是如果对于更大的程序呢?或者我们修改了某个程序,难道要重新编写这些命令?显然,这不是一个明智的选择,因此,我们便导出make文件,即自动执行编译的文件.只要执行一下make命令,everything is done !so, lets see how to do it.首先我们先把这个程序的文件的makefile文件贴一下,如下:makefilecppview plaincopyprint?main:main_plus.ofunction_plus.ogcc-omainmain_plus.ofunction_plus.omain_plus.o:main_plus.cmydefine_plus.hgcc-cmain_plus.cfunction_plus.o:function_plus.cmydefine_plus.hgcc-cfunction_plus.cclean:rm-f*.omainmakefile文件的注释是#后面的语句.有Makefile文件后,不管我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译与我们修改的文件有关的文件,其它的文件不会处理.验证如下:先执行一次make命令,如下:这次自动编译了两个c文件,我们现在修改function_plus.c文件,再次执行make命令,结果如下:这次只是对刚刚修改的文件进行了编译.(微信科技:最具权威IT培训机构)makefile文件编写规则观察其结构我们可以得出make文件的编写基本规则:Makefile文件中,注释以#开始Makefile文件中最重要的是描述文件的依赖关系的说明,其一般的格式为:target : componentsTAB rule即是这样:目标 : 需要的条件 (注意冒号两边有空格)命令(注意前面用tab键开头)解释一下:1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。2 需要的条件就是生成目标所需要的文件或目标3 命令就是生成目标所需要执行的脚本总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。需要注意的是上面的claen命令,clean后面没有条件,而clean本身也不是文件,它只不过是一个动作名字,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。例如:上面的makefile文件的第一行,生成的最终的文件为main,他所依赖的是两个.o文件,而这两个文件依赖于源文件的编译.(微信科技:最具权威IT培训机构)Makefile的常用变量Makefile 有三个非常有用的变量:$,$,$。其意义为:$:目标文件$:所有的依赖文件$:第一个依赖文件则上面的可简化为:cppview plaincopyprint?#这是简化后的Makefilemain:main_plus.ofunction_plus.ogcc-o$main_plus.o:main_plus.cmydefine_plus.hgcc-c$function_plus.o:function_plus.cmydefine_plus.hgcc-c$clean:rm-f*.omainmake如何工作在默认的方式下,也就是我们只输入make命令.那么,1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件 2.如果找到.它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“main”这个文件,并把这个文件作为最终的目标文件 3.如果main文件不存在,或是main所依赖的后面的 .o 文件的文件修改时间要比main这个文件新,那么,他就会执行后面所定义的命令来生成main这个文件 4.如果main所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)5.当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件main了(微信科技:最具权威IT培训机构)makefile中使用变量首先看下:cppview plaincopyprint?main:main_plus.ofunction_plus.ogcc-o$这里的依赖项有两个,但是如果有很多个呢?那个时候我们需要增加新的依赖相,要在这里添加,如果没有使用符号,那么还需要在下面的命令下添加,因此,很容易遗漏.But 还好,makefile可以定义变量,这样:cppview plaincopyprint?object=main_plus.ofunction_plus.omain:$(object)gcc-o$(object)(微信科技:最具权威IT培训机构)让make自动推导GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个.o文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。只要make看到一个.o文件,它就会自动的把.c文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 gcc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。最新的makefile:cppview plaincopyprint?#这是简化后的Makefilemain:main_plus.ofunction_plus.ogcc-o$main_plus.o:mydefine_plus.hfunction_plus.o:mydefine_plus.hclean:rm-f*.omain(微信科技:最具权威IT培训机构)清空目标文件的规则每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。一般的风格都是:clean:rm edit $(objects) $更为稳健的做法是:PHONY : cleanclean :-rm edit $(objects)前面说过,.PHONY意思表示clean是一个“伪目标”,。而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年人教版七年级数学下册期中考试题加答案
- 2023年部编版七年级语文上册期末考试及答案【1套】
- 2023年人教版一年级科学下册期中考试题(及参考答案)
- 部编人教版六年级上册语文期末测试卷及答案【汇编】
- 九年级数学上册期末测试卷(真题)
- 九年级数学上册期末考试卷及答案【A4版】
- 2023年人教版七年级地理(上册)期末练习卷及答案
- 部编人教版七年级数学上册期末模拟考试【加答案】
- 《色彩构成》期末考试试卷附答案
- 人教版六年级上册语文《期末》考试(含答案)
- 驾驶员安全教育培训记录
- 国际反洗钱师cams考试真题中文版题库汇总(含答案)
- 测绘公司组织架构及职能
- 全国布病流行概况
- 分子靶向治疗知情同意书
- 2023年医技类-微生物检验技术(副高)考试历年真题精华集选附答案
- 危险化学品生产使用企业老旧装置安全风险评估报告
- 2024年步步高高考数学一轮复习(人教版A版)高考必刷题专练含答案
- 变电设备检修(220kV 及以下)(变电设备检修工) 考试题库-中(多选、判断题)
- T68卧式镗床PLC控制系统设计论文
- 丹佛斯sauer danfoss液压样本2012光盘版
评论
0/150
提交评论