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. hdu3667 Transportation 费用与流量平方成正比的最小流 拆边法+最小费用最大流

    /** 题目:hdu3667 Transportation 拆边法+最小费用最大流 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 题意:n个城市由 ...

  2. 用e2fsck修复受损的linux文件系统

    今天想尝试直接从linux deepin拷贝一些文件到windows 10而不重启电脑,所以就安装Ext2Mgr了并加载了linux的几个磁盘: / /home 再次重启系统想进入linux的时发现系 ...

  3. js 控制按钮点击后不可用

    <input type="button" id="btn" value="免费获取验证码" /> <script type ...

  4. 从头认识java-17.4 具体解释同步(2)-具体解释竞争条件

    这一章节我们来具体讨论一下竞争条件. 1.为什么会引起竞争条件? 因为操作缺失原子性. 2.什么是原子性? 所谓原子操作是指不会被线程调度机制打断的操作:这样的操作一旦開始,就一直运行到结束.中间不会 ...

  5. curl使用例子

    地址:http://phpbook.phpxy.com/34771 参考:http://php.net/manual/zh/function.curl-setopt.php 我们将curl的步骤分为以 ...

  6. oracle游标:查询并打印员工的姓名和薪水

    --查询并打印员工的姓名和薪水 --set serveroutput on /* 1.光标的属性 %found:假设取到了记录就是true否则是false: %notfound: */ declare ...

  7. sql中between and 用法

    SQL中 between and是包括边界值的,not between不包括边界值,不过如果使用between and 限定日期需要注意,如果and后的日期是到天的,那么默认为00:00:00 例如: ...

  8. c++ std::ifstream

    #include <iostream> #include <plug/plug.h> using namespace std; //使用宽字符,我猜是为了适应那些要使用宽字符的 ...

  9. linux下安装oracle sqlplus以及imp、exp工具

    一.下载oracle 11g sqlplus软件 linux 64位操作系统,oracle安装包地址 http://www.oracle.com/technetwork/topics/linuxx86 ...

  10. iOS 如何用JSONKit读写JSON文件

     如何用JSONKit读写JSON文件 分类: ios2013-04-20 12:46 510人阅读 评论(0) 收藏 举报 JSON文件格式简单,使用方便,值得一用. 目前已经有多个库支持Json文 ...