1.序言:

  前面的课程讲解了从gcc编译过程到其实践,大家可以看到其实在这些步骤中有些是可以简化编译的,但由于参数多以及项目中文件数量多的原因难免会造成错误甚至是浪费大量的时间在这编译上,为此linux系统中专门也有这个工具:makefile。

2.原理:

  其实本质Makefile文件(通常开头是大写M)就是一个shell文件通过指定的规则来编译文件。知识点如下:

  makefile工具是通过其规则来执行命令,一般其内容分为宏定义以及命令。简单的宏定义在最后讲解下,这先讲命令格式:

  target ... : prerequisites ...

    command

  其中target就是目标文件可以是.o文件也可以是可执行文件;

  prerequisites是生成target所需要的依赖文件,可以是代码文件,也可以是目标文件;

  command就是makefile执行的命令,这里之前忘记了多谢崔好好的提醒,一定是要开Tab键开始后输入,后面回复也有;

  本文就讲解一下makefile工具的使用。

3.实践:

  这节课中使用上节课原有的文件calc.c、calc.h、calcmain.c3个文件(不知道请回看),先清空掉其它文件,,再创建Makefile文件,步骤如下:

  1>创建Makefile文件,并输入如下内容:

calc:calc.o calcmain.o
gcc -Wall calc.o calcmain.o -o calc
calcmain.o:calcmain.c
gcc -Wall -c calcmain.c -o calcmain.o
calc.o:calc.c
gcc -Wall -c calc.c -o calc.o .PHONY:clean clean: rm calc.o calcmain.o calc

  上面代码其中第一行:

  calc:calc.o calcmain.o:calc为生成的可执行文件对应规则的target;而calc.o calcmain.o是生成calc文件的依赖文件;
         gcc -Wall calc.o calcmain.o -o calc:这就是依赖条件满足执行的命令;
同理calcmain.o:calcmain.c:calcmain.o这个目标文件要依赖于calcmain.c文件,注明:如果单修改了calcmain.c源文件,那么可用make calcmain.o和make calc命令执行生成此目标文件操作后链接生成可执行文件
         gcc -Wall -c calcmain.c -o calcmain.o:生成目标文件;
最后clean是伪目标,通常情况下在其前面加上如下防止当前目录有相同的指令:
.PHONY:clean

  2>现在这个Makefile文件制作好,直接输入命令make就可以完成编译工作:

make

  如果想删除相关生成的文件执行:

make clean

  如果单修改了calcmain.c源文件,那么单生成calcmain.o文件,在链接成可执行文件,执行如下:

make clacmain.o
make calc

  这样在项目文件多的时候就可以省掉很多时间了!这个命令一敲很爽吧,哈哈。。。。。。

3>细心的读者就可以想到了:竟然Makefile是shell文件,不能用变量来替换其内容多次出现的问题,这个问题真好其实这就是接下来讲的部分了。

     Makefile文件第一行的calc:calc.o calcmain.o如果把后面的目标文件使用变量的话是不是可以减少维护量啊,如果可执行文件也用变量替换是不是也可以啊,这2个问题现在解决下,新版的Makefile文件如下:
EXE=calc
OBJECTS=calcmain.o calc.o $(EXE):$(OBJECTS)
gcc -Wall $^ -o $EXE
calcmain.o:calcmain.c
gcc -Wall -c $< -o $@
calc.o:calc.c
gcc -Wall -c $< -o $@
clean:
rm -f $(EXE) $(OBJECTS)

  这样使用一些预定义变量如$^就是所有依赖文件;$<就是依赖的第一个文件;$@就是当前的target对象。这样在文件较多时候就比较好维护了。

  这节课就讲到这里,还有一些如预定义变量可以自己网上找找看看。
 
 
 
 

第三课 Makefile文件的制作(上)的更多相关文章

  1. 第五课 Makefile文件的制作(补充)

    序言: 前面的几节课讲解Makefile的一些基本知识也做了一些小例子实践了几下,那么到现在普通的练习则是没有问题.但是如果做项目文件较多又分层次等等还是会碰上好多问题的,这节课补充一些知识. 知识点 ...

  2. 第四课 Makefile文件的制作(下)

    1序言: 前面一节课讲解了Makefile的基础知识包括原理.预定义以及命令格式,这样是可以完成一个自动编译的文件,这些知识可以帮你完成.想想mak真是强大啊,可能有些同志发现了如果项目文件太多每个目 ...

  3. 【Linux探索之旅】第二部分第三课:文件和目录,组织不会亏待你

    内容简介 1.第二部分第三课:文件和目录,组织不会亏待你 2.第二部分第四课预告:文件操纵,鼓掌之中 文件和目录,组织不会亏待你 上一次课我们讲了命令行,这将成为伴随我们接下来整个Linux课程的一个 ...

  4. 【Linux探索之旅】第二部分第三课:文件和文件夹,组织不会亏待你

    wx_fmt=jpeg" alt="" style="max-width:100%; height:auto!important"> 内容简单介 ...

  5. 【Linux探索之旅】第四部分第三课:文件传输,潇洒同步

    内容简单介绍 .第四部分第三课:文件传输.潇洒同步 2.第四部分第四课:分析网络.隔离防火 文件传输.潇洒同步 这一课的内容相对简单,所以我们慢慢享用. 经过上一课的学习.我们已经知道怎样远程连接到其 ...

  6. 【OpenWRT】【RT5350】【三】MakeFile文件编写规则和OpenWRT驱动开发步骤

    一.Makefile文件编写 http://www.cnblogs.com/majiangjiang/articles/3218002.html 可以看下上面的博客,总结的比较全了,在此不再复述 二. ...

  7. 微信小程序自学第三课:文件作用域,模块化

    一.文件作用域 在 JavaScript 文件中声明的变量和函数只在该文件中有效:不同的文件中可以声明相同名字的变量和函数,不会互相影响. 通过全局函数 getApp() 可以获取全局的应用实例,如果 ...

  8. 【C语言探索之旅】 第二部分第三课:数组

    内容简介 1.课程大纲 2.第二部分第三课: 数组 3.第二部分第四课预告:字符串 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语 ...

  9. 简介make命令和makefile文件

    一.为什么要用到 make 命令和 makefile 文件 在 Linux 下编写一个程序,每次编译都需要在命令行一行一行的敲命令.如果是一个很小的程序还好说,命令不怎的复杂,编译速度也挺快,但是对于 ...

随机推荐

  1. centos yum安装及手动编译ettercap

    眼下流行的软件包有二种形式 ,一种是以rpm包,deb包为代表的智能安装包.还有一种是以file.tar.gz形式的压缩 一 智能安装 以 mysql为例 yum search mysqld 二 手动 ...

  2. 微信小程序3 - 对象的合并

    ES6中 Object.assign方法用于对象的合并,将源对象( source )的所有可枚举属性,复制到目标对象( target ). 限制:   只是浅拷贝, 即 内部对象 不会拷贝,只是 引用 ...

  3. HTML5课程

    1.新语义化标签:section.header.footer.nav.article.aside.figure.dialog.time.meter.mark.progress.video 2.最新的属 ...

  4. 第一百五十九节,封装库--JavaScript,表单序列化结合ajax提交数据

    封装库--JavaScript,表单序列化结合ajax提交数据 封装库,表单序列化方法 /** xu_lie_biao_dan()方法,表单序列化方法,将自动获取指定表单里面的各项字段name值和va ...

  5. Windows下RabbitMQ安装,部署,配置

    安装部署 1.当前环境以及参考资料出处 部署环境:windows server 2008 r2 enterprise 官方安装部署文档:http://www.rabbitmq.com/install- ...

  6. Linux IO操作——RIO包

    1.linux基本I/O接口介绍 ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, void *buf, siz ...

  7. HDU2059 龟兔赛跑 【DP】

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. 蓝桥杯 第四届C/C++预赛真题(3) 第39级台阶(递归)

    题目标题: 第39级台阶 小明刚刚看完电影<第39级台阶>,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个台阶 ...

  9. DefaultActionInvocation类的执行action

    DefaultActionInvocation类的执行action 上一章里面有提到过DefaultActionInvocation类的invoke方法里面的invokeActionOnly方法.没有 ...

  10. js获取上个月的第一天和最后一天

    var now = new Date(); var fd = new Date(now.getFullYear(), now.getMonth()-1 ,1).toLocaleDateString() ...