linux 程序设计学习笔记---动手编写makefile文件——微

上传人:xzh****18 文档编号:36570329 上传时间:2018-03-30 格式:DOC 页数:8 大小:142KB
返回 下载 相关 举报
linux 程序设计学习笔记---动手编写makefile文件——微_第1页
第1页 / 共8页
linux 程序设计学习笔记---动手编写makefile文件——微_第2页
第2页 / 共8页
linux 程序设计学习笔记---动手编写makefile文件——微_第3页
第3页 / 共8页
linux 程序设计学习笔记---动手编写makefile文件——微_第4页
第4页 / 共8页
linux 程序设计学习笔记---动手编写makefile文件——微_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《linux 程序设计学习笔记---动手编写makefile文件——微》由会员分享,可在线阅读,更多相关《linux 程序设计学习笔记---动手编写makefile文件——微(8页珍藏版)》请在金锄头文库上搜索。

1、Linux 程序设计学习笔记-动手编写 makefile 文件 微信科技Befroe Beginning.之前定了暑假的 plan ,关于 Linux 的书籍现在在看的是 ALP 和 Linux 高级程序设计(杨宗德)第三版.在计划中的是 Linux 高级环境编程.现在开始关于 Linux 程序设计的第一篇学习笔记.本来打算把名字写成教程,不过觉得自己完全是新手在自学,还是写学习笔记比较负责和适合.希望可以一起学习进步.(微信科技:最具权威 IT 培训机构)引入引入首先我们假设这样一个场景.我们有一个程序包含了三个文件,分别是源码文件main_plus,c 和 function_plus.c

2、以及头文件 mydefine_plus.h.其中 main 主要是调用功能函数,功能函数则是实现简单的累加,头文件声明函数和一些库函数.代码分别如下:main_plus.ccpp view plaincopyprint?/* File Name: main_plus.c Author: suool Mail: Created Time: 2014 年 07 月 23 日 星期三 17 时 31 分 23 秒 */ /*file main_plus.c */ /* 接收参数,调用功能函数,输出结果. */ #include “mydefine_plus.h“ int main(void) in

3、t a=0, b=0; printf(“这是一个求和的程序,请输入数字 a 和 b,程序讲输出 a 到 b 的累加结果.n“); printf(“Please enter integer a:“); scanf(“%d“, printf(“nPlease enter integer b:“); scanf(“%d“, if(ab) printf(“nThe sum is %dn“, plus(b,a); else printf(“nThe sum is %dn“, plus(a,b); return 0; function_plus.ccpp view plaincopyprint?/* Fi

4、le Name: function_plus.c Author: suool Mail: Created Time: 2014 年 07 月 23 日 星期三 17 时 31 分 40 秒 */ /*file function_plus.c */ /* 对 a 到 b 的累加求和*/ #include “mydefine_plus.h“ int plus(int a, int b) int sum = a; int i; for (i=a+1; i File Name: mydefine_plus.h Author: suool Mail: Created Time: 2014 年 07

5、月 23 日 星期三 17 时 36 分 16 秒 */ /* file mydefine_plus.h */ /* 函数声明和包含*/ #ifndef _MYDEFINE_PLUS_H #define _MYDEFINE_PLUS_H #include int plus(int a, int b); #endif 现在我们要编译这个程序,我们可以怎么做呢?这就是这次要解决的问题.(微信科技:最具权威 IT 培训机构)make 文件编写文件编写对于上面的问题,我们传统的解决方法是这样的:即是分别编译这两个文件,然后链接变成目标可执行文件,当然,对于三个甚至五个的这样的程序都是可以的,但是如果对

6、于更大的程序呢?或者我们修改了某个程序,难道要重新编写这些命令?显然,这不是一个明智的选择,因此,我们便导出 make 文件,即自动执行编译的文件.只要执行一下 make 命令,everything is done !so, lets see how to do it.首先我们先把这个程序的文件的 makefile 文件贴一下,如下:makefilecpp view plaincopyprint?main : main_plus.o function_plus.o gcc -o main main_plus.o function_plus.o main_plus.o : main_plus.c

7、 mydefine_plus.h gcc -c main_plus.c function_plus.o : function_plus.c mydefine_plus.h gcc -c function_plus.c clean: rm -f *.o main makefile 文件的注释是#后面的语句.有 Makefile 文件后,不管我们什么时候修改了源程序当中的什么文件,我们只要执行 make 命令,我们的编译器都只会去编译与我们修改的文件有关的文件,其它的文件不会处理.验证如下:先执行一次 make 命令,如下:这次自动编译了两个 c 文件,我们现在修改 function_plus.c

8、 文件,再次执行 make命令,结果如下:这次只是对刚刚修改的文件进行了编译.(微信科技:最具权威 IT 培训机构)makefile 文件编写规则文件编写规则观察其结构我们可以得出 make 文件的编写基本规则:Makefile 文件中,注释以“#“开始Makefile 文件中最重要的是描述文件的依赖关系的说明,其一般的格式为:target : componentsTAB rule即是这样:目标 : 需要的条件 (注意冒号两边有空格)命令 (注意前面用 tab 键开头)解释一下:1 目标可以是一个或多个,可以是 Object File,也可以是执行文件,甚至可以是一个标签。2 需要的条件就是生

9、成目标所需要的文件或目标3 命令就是生成目标所需要执行的脚本总结一下,就是说一条 makefile 规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。需要注意的是上面的 claen 命令,clean 后面没有条件,而 clean 本身也不是文件,它只不过是一个动作名字,其冒号后什么也没有,那么,make 就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。例如:上面的 makefile 文件的第一行,生成的最终的文件为 main,他所依赖的是两个.o 文件,而这两个文件依赖于源文件的编译

10、.(微信科技:最具权威 IT 培训机构)Makefile 的常用变量的常用变量Makefile 有三个非常有用的变量:$,$,$。其意义为:$:目标文件$:所有的依赖文件$:第一个依赖文件则上面的可简化为:cpp view plaincopyprint?#这是简化后的 Makefile main : main_plus.o function_plus.o gcc -o $ $ main_plus.o : main_plus.c mydefine_plus.h gcc -c $ function_plus.o : function_plus.c mydefine_plus.h gcc -c $

11、clean: rm -f *.o main make 如何工作如何工作在默认的方式下,也就是我们只输入 make 命令.那么,1.make 会在当前目录下找名字叫“Makefile”或“makefile”的文件2.如果找到.它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“main”这个文件,并把这个文件作为最终的目标文件3.如果 main 文件不存在,或是 main 所依赖的后面的 .o 文件的文件修改时间要比 main 这个文件新,那么,他就会执行后面所定义的命令来生成 main 这个文件4.如果 main 所依赖的.o 文件也不存在,那么 make 会在当前文件中找

12、目标为.o 文件的依赖性,如果找到则再根据那一个规则生成.o 文件。(这有点像一个堆栈的过程)5.当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 .o 文件,然后再用 .o 文件生命 make 的终极任务,也就是执行文件 main 了(微信科技:最具权威 IT 培训机构)makefile 中使用变量中使用变量首先看下:cpp view plaincopyprint?main : main_plus.o function_plus.o gcc -o $ $ 这里的依赖项有两个,但是如果有很多个呢?那个时候我们需要增加新的依赖相,要在这里添加,如果没有使用符号,那么还需要在下面

13、的命令下添加,因此,很容易遗漏.But 还好,makefile 可以定义变量,这样:cpp view plaincopyprint?object = main_plus.o function_plus.o main : $(object) gcc -o $ $(object) (微信科技:最具权威 IT 培训机构)让让 make 自动推导自动推导GNU 的 make 很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个.o文件后都写上类似的命令,因为,我们的 make会自动识别,并自己推导命令。只要 make 看到一个.o文件,它就会自动的把.c文件加在依赖关系中,

14、如果make 找到一个 whatever.o,那么 whatever.c,就会是 whatever.o 的依赖文件。并且 gcc -c whatever.c 也会被推导出来,于是,我们的 makefile 再也不用写得这么复杂。最新的 makefile:cpp view plaincopyprint?#这是简化后的 Makefile main : main_plus.o function_plus.o gcc -o $ $ main_plus.o : mydefine_plus.h function_plus.o : mydefine_plus.h clean: rm -f *.o main (微信科技:最具权威 IT 培训机构)清空目标文件的规则清空目标文件的规则每个 Makefile 中都应该写一个清空目标文件(.o 和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。一般的风格都是:clean:rm edit $(objects) $ 更为稳健的做法是:PHONY : cleanclean :-rm edit $(objects)前面说过,.PHONY 意思表示 clean 是一个“伪目标”,。而在 rm 命令

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号