简单介绍Makefile

  makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至可以在makefile中执行shell脚本。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

makefile简介

1  一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需 要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

2   makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的 make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

3  Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。

编译和链接规则(输入make命令之后将按照以下规则工作

  • 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
  • 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
  • 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

通用的Makefile里包含什么?

l在一个通用Makefile中通常包含下面内容:

l1、需要由make工具创建的目标体(target),通常是目标文件或可执行文件。

l2、要创建的目标体所依赖的文件(dependency_file)。

l3、创建每个目标体时需要运行的命令(command)。

l格式如下:

l target:dependency_files

l<TAB>command

完整Makefile里包含什么?

l显式规则  由Makefile的书写者明显指出,要生成的文件,文件的依赖关系和生成的命令  如: foo.o : foo.c defs.h      依赖关系

l    gcc -o foo.o foo.c 生成目标的方法(方式)

l隐晦规则  make有自动推导的功能,这样我们就可以简略地书写Makefile              如:  foo.o : foo.c

l变量定义  这里面的变量一般都是字符串,他有点像c语言的宏    如:H: =foo.c     gcc -o foo.o $(H) (赋值可以用: =也可以直接用 =)

l文件指示  包含3部分,一个是在一个Makefie中引用另一个Makefile,就像c语言的  include一样;另一个是根据某些情况指定Makefile中的有效部分,就像C语言    中的预编译#if一样;还有就是定义一个多行的命令。

l注释  注释符用"#"

st_work : main.o   st_work.o    fun.o
	gcc   main.o  st_work.o  fun.o  -o st_work main (命令一定要用以Tab开头)
st_work.o : st_work.c
	gcc  -c st_work.c   -o st_work
main.o : main.c   st_work.h
	gcc -c main.c -o  main.o
fun.o  : fun.c fun.h
	gcc -c  fun.c -o fun.o
clean:
	rm -f st_work *.o
    -c参数,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件

 

多目录下Makefile的写法(1) 

目标:在工作目录下有4个文件夹  分别是 sources(源文件) obj (中间文件)headers(头文件) bin(目标文件)

sources里面有 main.c  st_work.c fun.c

obj 里面最初没有文件

headers 里面有 fun.h st_work.h

最终目标取名为 st_work   它应存放到bin里面

开始写Makefile的预备知识:

gcc 的3个参数:

1. -o 指定目标文件

gcc sources/main.c -o bin/main

2. -c 编译的时候只生产目标文件不链接

gcc -c sources/main.c -o obj/main.o

3. -I 主要指定头文件的搜索路径

gcc -I headers -c main.c -o main.o

 

多目录下Makefile的写法(2) 

bin/st_work : obj/main.o  obj/st_work.o  obj/fun.o

gcc  obj/main.o obj/st_work.o  obj/fun.o  -o bin/st_work  (命令一定要用以Tab开头)

obj/st_work.o : sources/st_work.c

gcc  -I  headers   -c   sources/st_work.c  -o  obj/st_work.o

obj/main.o :   sources/main.c

gcc  -I  headers   -c   sources/main.c    -o  file_o/main.o

obj/fun.o  :  sources/fun.c

gcc  -I  headers   -c    file_c/fun.c      -o  file_o/fun.o

clean:

rm -f bin/st_work file_o/*.o

用隐式规则改进:  

3个符号介绍:

1.  [email protected]     表示要生成的目标

2.  $^     表示全部的依赖文件

3.  $<     表示第一个依赖文件

bin/st_work : obj/main.o  obj/st_work.o  obj/fun.o

gcc  $^  -o [email protected]  (命令一定要用以Tab开头)

obj/st_work.o : sources/st_work.c

gcc  -I  headers   -c   $<  -o  [email protected]

obj/main.o :   sources/main.c

gcc  -I  headers   -c   $<  -o  [email protected]

obj/fun.o  :  sources/fun.c

gcc  -I  headers   -c   $<  -o  [email protected]

clean:

rm -f bin/st_work file_o/*.o

变量的引入和应用:

CC=gcc

HD=-I headers

SC=-c $<

OBJ=-o [email protected]

bin/st_work : obj/main.o  obj/st_work.o  obj/fun.o

gcc  $^  -o [email protected]  (命令一定要用以Tab开头)

obj/st_work.o : sources/st_work.c

$(CC)  $(HD)  $(SC)  $(OBJ)

obj/main.o :   sources/main.c

$(CC)  $(HD)  $(SC)  $(OBJ)

obj/fun.o  :  sources/fun.c

$(CC)  $(HD)  $(SC)  $(OBJ)

clean:

rm -f bin/st_work file_o/*.o

提示信息

l当我们输入make到终端的时候,终端就会依次显示所有的执行过的命令,方便我们查看进度。

lgcc  -I  headers   -c   sources/st_work.c  -o  obj/st_work.o

lgcc  -I  headers   -c   sources/main.c    -o  file_o/main.o

lgcc  -I  headers   -c    file_c/fun.c      -o  file_o/fun.o

lgcc  obj/main.o obj/st_work.o  obj/fun.o  -o bin/st_work

l输入make clean的时候    也会执行一系列的命名

l信息太多了可能我们不希望终端全部输出到屏幕上:

l可以这样处理   “在命令前面加个@  ”

clean:                        clean:

rm -f bin/st_work file_o/*.o       @rm -f bin/st_work file_o/*.o

这样就没信息输出了

时间: 06-29

简单介绍Makefile的相关文章

简单编写Makefile

相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有想象的那么难写,只要你明白了其中的原理,自己实践几次.你也可以自己写makefile,让别人对你头来羡慕的目光. 下面本人介绍一下自己的学习成果,初学阶段,欢迎大家多多指正.简单的说,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至可以在m

CMake 简单介绍 图

http://tech.uc.cn/?p=914 CMake特点 CMake需要用户用CMake规范的语法编写CMake脚本,该语法简单易用,入门极其顺手 原生支持 C/C++/Fortran/Java 的相依性的自动分析功能,免除了程序员对代码依赖的调整,对整个开发工作帮助很大 支持 SWIG.Qt.FLTK 开发框架 支持跨平台编译,这是CMake名字的来源 能够转换特殊平台的 IDE 项目文档,如xcode 与Dart.CTest 和 CPack 集成,可以组成自动化的构建系统 CMake

Linux 内核开发—内核简单介绍

内核简单介绍 Linux 构成 Linux 为什么被划分为系统空间和内核空间 隔离核心程序和应用程序,实现对核心程序和数据的保护. 什么内核空间,用户空间 内核空间和用户空间是程序执行的两种不同的状态,Linux对自身软件系统进行了划分,一部分核心的软件独立于普通的软件,拥有特权级别,可以訪问平台的全部硬件和资源,称为"内核空间".而普通的软件执行在"用户空间",它仅仅拥有有限的系统资源,不能直接訪问内核空间和硬件资源. 将系统分为"内核空间"和

CMake 简单介绍

CMake特点 CMake需要用户用CMake规范的语法编写CMake脚本,该语法简单易用,入门极其顺手 原生支持 C/C++/Fortran/Java 的相依性的自动分析功能,免除了程序员对代码依赖的调整,对整个开发工作帮助很大 支持 SWIG.Qt.FLTK 开发框架 支持跨平台编译,这是CMake名字的来源 能够转换特殊平台的 IDE 项目文档,如xcode 与Dart.CTest 和 CPack 集成,可以组成自动化的构建系统 CMake vs GNU AutoTools 使用CMake

python的列表,元组和字典简单介绍

引 入 java                                   python 存取多个值:数组或list集合 ------------------------> 列表,元组 key-value格式:    Map        ------------------------>    字典 自己学习发现,java跟python这两门面向对象语言在数据类型的定义上,很多思想都是互通的,这里不说java,简单介绍一下python的列表,元组和字典. 一.列表 List: 最通

javascript的return语句简单介绍

javascript的return语句简单介绍:return语句在js中非常的重要,不仅仅具有返回函数值的功能,还具有一些特殊的用法,有个清晰的把握是非常有必要的.下面就结合实例简单介绍一下return语句的作用.一.用来返回控制和函数结果:通常情况,return语句对于一个函数是很有必要的,因为往往需要函数在一系列的代码执行后会得到一个期望的返回值,而此值就是通过return语句返回,并且将控制权返回给主调函数.语法格式: return 表达式 代码实例如下: function add(){

Object-c集合的简单介绍

一.简单介绍 NSArray/NSMutableArray NSSet/NSMutableSet NSDictionary/NSMutableDictionary NSArray.NSSet.NSDictionary是不可变的,创建的时候初始化 NSMutableArray.NSMutableSet.NSMutableDictionary是可变的 二.使用介绍 NSArray是有序的数组 NSMutableArray *myArray=[[NSMutableArray alloc] init];

plsql的环境与介绍:环境的搭建和plsql的简单介绍

PLSQL编程 1.环境的搭建 (1)创建一个存储表空间 SQL> conn /as sysdbaConnected. SQL> create tablespace plsql datafile '/u01/oracle/oradata/ORCL/plsql01.dbf' size 1G; Tablespace created. (2)创建PLSQL用户SQL> create user plsql identified by plsql default tablespace plsql;

CSS之box-sizing的用处简单介绍

前几天才发现有 box-sizing 这么个样式属性,研究了一番感觉很有意思, 通过指定容器的盒子模型类型,达到不同的展示效果 例如:当一个容器宽度定义为 width:100%;  之后,如果再增加 padding 或者 border 则会溢出父容器,是向外扩张的 如果使用该样式,指定为 box-sizing: border-box; 则 padding 和 border 就不会再溢出,而是向内收缩的,这个效果感觉非常实用, 特别是 input 和 textarea 等 现在设置 100% 再直