MakeFile 文件的使用
什么是Makefile?
为什么要使用Makefile?
如何使用make命令?
Makefile 文件描述了整个工程的编译、连接等规则,make是一个命令工具,它解释Makefile中的指令(规则)。
一个基本的makefile主要由目标对象、依赖文件、变量和命令4部分组成。
命令行中执行makefile内容:
◆宏定义
◆ 源文件之间的相互依赖关系
◆ 可执行的命令
通常makefile文件中的一条规则的编写形式如下:
target ... : prerequisites ...
(tab)command
...
...
解释为:
目标:依赖文件
(制表符)执行指令 ...
下面来看一个具体的例子:
新建 三个文件: main.c add.c fun.h
fun.h
#include<sdtio.h>
#include<math.h>
int add(int a,int b);
add.c
int multi(int a,int b)
{
return a+b;
}
main.c
#include"fun.h"
int main()
{
int a=12,b=6;
c=add(a,b);
printf("%d\n",add(a,b)); return 0;
}
下图体现了文件间的依赖关系:

我们先使用gcc 命令来构建这个工程:
gcc -c main.c add.c
查看当前文件目录:

文件夹中多了main.o 和 add.o这两个文件,接着在执行下面的命令:
gcc main.o add.o -o math -l m//用main.o add.o 进一步生成目标 ,最后两个参数 -l m 为连接数学函数库

我们发现生成目标文件math需要两步,也就是要先生成main.o 和 add.o 这两个中间文件,这两个文件称为目标文件的直接依赖文件,那么main.c和add.c分别又是main.o和add.o的直接依赖文件。
makefile正事依据这样一层一层的的依赖关系和连接 依赖文件 和 目标文件 的命令 所构成的。
下面来看一个最基本的makefile文件:
以下makefile文件显示了各个目标与依赖文件直接的关系,以及生成它们的命令
add:main.o add.o //目标文件add的依赖文件为main.o、add.o
gcc -o add main.o add.o -l m //将目标文件连接为可执行文件,并连接数学函数库 main.o:main.c //main.o的依赖文件为main.c
gcc -c main.c //将源文件main.c编译成目标文件main.o add.o:add.c
gcc -c test.c clean: //清理中间文件
rm main.o add.o add
编写makefile文件中要注意的几点:
1、clean没有被第一个目标add直接或间接依赖,那么它后面的命令就不会被自动执行可以在make 命令后面跟clean目标作为参数来执行其后所定义的命令,
即执行"make clean"命令,用于清除make过程中生成的目标,以便重新编译
2、在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。
3、记住,make并不管命令是怎么工作的,他只管执行所定义的命令。make会比较目标文件和依赖文件的修改日期,即时间戳
如果依赖文件的日期要比目标文件的日期要新,或者目标不存在的话,那么,make就会执行后续定义的命令
先执行rm main.o add.o math 清除之前生成的中间文件和目标文件
然后用ls命令查看以下当前目录所包含的文件:

执行make命令,再用ls查看当前目录下的文件:

我们发现,make命令已经生成了add目标文件,还有依赖文件main.o, add.o
执行结果:

执行make命令时,可以通过参数为makefile文件的宏变量CC赋值,通过宏变量CC指定不同的编译器来编译源文件
CC=
add:main.o add.o
$(CC) -o add main.o add.o
main.o:main.c
$(CC) -c main.c
add.o:add.c
$(CC) -c add.c clean:
rm main.o add.o add
下面,对makefile做一点小小的改动:
OBJS=main.o add.o #使用了变量OBJS
CC=gcc
CFLAGS=-Wall -O -g add:$(OBJS)
$(CC) $(OBJS) -o add
main.o:main.c
$(CC) $(CFLAGS) -c main.c
add.o:add.c
$(CC) $(CFLAGS) -c add.c clean:
rm *.o add
这里使用到了变量,用CC代替了gcc, CFLAGS是makefile中预定义的变量,我们为将它初始化为-Wall -O -g (开启警告信息、编译链接过程中执行优化处理、增加调试信息),这三个参数都是gcc参数的常用的值,关于gcc参数常用值,这里不做具体介绍。
Makefile中允许使用简单的宏指代源文件及其相关编译信息,在Linux中也称宏为变量。在引用宏时只需在变量前加$符号,
但值得注意的是,如果变量名的长度超过一个字符,在引用时就必须加圆括号()。
有效的宏引用
$(CFLAGS)
$Z
$(Z)
makefile中常见的预定义变量及其部分默认值

我们先使用make clean 清除之前生成的目标文件,再执行make命令,得到的结果是一样的.

下面再对makefile进行升级:
#Makefile
CC=gcc
CFLAGS=-Wall -O -g
OBJS=main.o add.o
add:$(OBJS)
$(CC) $^ -o $(OBJS)
main.o:main.c
$(CC) $(CFLAGS) -c $< -o $@
add.o:add.c
$(CC) $(CFLAGS) -c $< -o $@ clean:
rm -f *.o
这里使用了makefile 的自动变量,下表是makefile中常见的自动变量:
makefile中常见的自动变量

自动变量通常可以代表编译语句中出现的目标文件和依赖文件等,自动变量的使用进一步简化makefile的编写,自动变量的书写比较难记,但是在熟练了之后会非常方便。
下面是一个使用二进制作为目标文件的makefile模板:
.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g -I../include //-I[头文件目录路径] :用来找到不再当前目录下的头文件
BIN=main add //这一行添加依赖文件的名称
all:$(BIN)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o $(BIN)
终极版makefile

关于maefile的写法,其形式可能有很多种,makefile还支持带有条件语句的条件编译、函数、以及一些隐含规则等,这里不做深入介绍,只有多加练习、实践,才能真正掌握make这个强大的工具。
MakeFile 文件的使用的更多相关文章
- 编写一个通用的Makefile文件
1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...
- Linux工具入门:make工具与Makefile文件
1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...
- Makefile文件学习总结
Makefile文件相当于是一种脚本编程语言,目的是实现自动化编译.编写makefile文件的过程中可以使用变量.控制结构和函数等一般编程语言的特性. Makefile文件的组成内容.makefile ...
- 利用 autoconf 和 automake 生成 Makefile 文件
一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...
- linux下使用automake工具自动生成makefile文件
linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...
- Ubuntu ./configure 半途终止 导致没有生成makefile文件 解决方法
在安装thrift的时候,解压包进入目录,执行命令: ./configure 之后,发现某些包没有安装,导致configure到一半的时候退出,接着make发现没有makefile文件.估计是我系统安 ...
- 【OpenWRT】【RT5350】【三】MakeFile文件编写规则和OpenWRT驱动开发步骤
一.Makefile文件编写 http://www.cnblogs.com/majiangjiang/articles/3218002.html 可以看下上面的博客,总结的比较全了,在此不再复述 二. ...
- linux中Makefile文件相关内容
第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
- C++学习笔记25:makefile文件2
Makefile文件语法 行解析:命令按行解析 命令行的行首字符为Tab键,其他行的行首字符不得为Tab键,但可以使用多个空格缩进 换行:命令太长时,行尾使用"\"换行 注释:行首 ...
随机推荐
- Nutch学习笔记二——抓取过程简析
在上篇学习笔记中http://www.cnblogs.com/huligong1234/p/3464371.html 主要记录Nutch安装及简单运行的过程. 笔记中 通过配置抓取地址http://b ...
- 关于SharePoint 讨论板的一些知识
关于SharePoint 讨论板的一些知识 近期公司项目可能要用到讨论板.需求是这种: 怎样在回复中仅仅让查看登陆者和讨论主题公布者的信息. 比方我公布 ...
- PHP ORM操作MySQL数据库
ORM----Oriented Relationship Mapper,即用面向对象的方式来操作数据库.归根结底,还是对于SQL语句的封装. 首先,我们的数据库有如下一张表: 我们希望能够对这张表,利 ...
- SpringMVC学习(一):搭建SpringMVC-注解-非注解
文章参考:http://www.cnblogs.com/Sinte-Beuve/p/5730553.html 一.环境搭建: 目录结构: 引用的JAR包: 如果是Maven搭建的话pom.xml配置依 ...
- 目标检测之harr---点角检测harr
Haar特征与积分图 1. Adaboost方法的引入 1.1 Boosting方法的提出和发展 在了解Adaboost方法之前,先了解一下Boosting方法. 回答一个是与否的问题,随机猜测可以获 ...
- 数据挖掘项目之---通过对web日志的挖掘来实现内容推荐系统
先说一说问题,不知道大家有没有这样的经验,反正我是经常碰到. 举例1,某些网站每隔几天就发邮件给我,每次发的邮件内容都是一些我根本不感兴趣的东西,我不甚其扰,对其深恶痛绝. 举例2,添 ...
- 使用C#解决部分Win8.1系统窗体每隔几秒失去焦点的问题
使用了Win8.1 With Update 1后,发现重新启动系统后,当前激活的窗体总是每隔几秒失去焦点.过0.5~1秒焦点回来.导致输入无法正常工作,严重影响使用心情和效率. 在网上找了非常久,也没 ...
- php 去除html标记-strip_tags和htmlspecialchars的区别
strip_tags 去掉 HTML 及 PHP 的标记. 语法: string strip_tags(string str); 传回值: 字串 函式种类: 资料处理 内容说明 本函式可去掉字串中包含 ...
- GCJ Qualification Round 2016 B题
经典的翻饼问题,直接做:从下往上看,已翻好的饼忽略掉:从上往下,连续的已翻好的一起翻过来:整个翻过来. /* * Author : ben */ #include <cstdio> #in ...
- c# winform中预防窗体重复打开
当窗体以非模态形式打开的时候,有可能出现重复打开的情形,利用以下的代码可以预防重复打开! foreach (Form f in Application.OpenForms) { if (f.Nam ...