博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第三课 Makefile文件的制作(上)
阅读量:5317 次
发布时间:2019-06-14

本文共 1920 字,大约阅读时间需要 6 分钟。

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 calccalcmain.o:calcmain.c     gcc -Wall -c calcmain.c -o calcmain.ocalc.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.omake calc

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

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

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

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

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

转载于:https://www.cnblogs.com/luoliang/p/3852348.html

你可能感兴趣的文章
Git删除分支/恢复分支
查看>>
IIS7中使用集成模式时出现HttpException
查看>>
springboot三种过滤功能的使用与比较
查看>>
获取帮助命令
查看>>
UVA-401 Palindromes
查看>>
CentOS学习笔记--程序管理
查看>>
堆栈的理解
查看>>
picturebox 图片自适应
查看>>
NOI导刊模拟2—电话网络 解题报告
查看>>
[Tyvj1114 搭建双塔]
查看>>
【代码笔记】iOS-播放从网络上下载的语音
查看>>
LeetCode 114. Flatten Binary Tree to Linked List
查看>>
ORACLE 数据库安装后,PL/SQL的登录问题完美解决
查看>>
进程池
查看>>
c# 操作excle
查看>>
python:软件目录结构规范
查看>>
简述HTML DOM及其节点分类
查看>>
js题集19
查看>>
程序设计中的感悟
查看>>
JDK中DNS缓存的分析
查看>>