简单介绍

1)make:利用 make 工具能够自己主动完毕编译工作。这些工作包含:假设仅改动了某几个源文件,则仅仅又一次编译这几个源文件[make通过比对对应的.c文件与.o文件的时间];假设某个头文件被改动了,则又一次编译全部包含该头文件的源文件。利用这样的自己主动编译可大大简化开发工作,避免不必要的又一次编译。

2)Mackfile:make工具通过一个称为 Mackfile 的文件来完毕并自己主动维护编译工作。Mackfile文件描写叙述了整个project的编译、连接等规则。

Mackfile基本规则

Target ...: Dependencies ...

Command ...

说明:

1)目标(TARGET):即终于想要产生的文件。如:可运行文件,目标文件或中间文件等;目标也能够是要运行的动作,如clean,也称为伪目标。

2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。

3)命令(COMMAND):是make运行的动作(shell命令或是可在shell下运行的程序,如echo)。注意:每一个命令行的起始字符必须为TAB字符!

假设DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要运行,这就是Makefile最核心的内容.

简单的Mackfile演示样例

#1 最简单

hello:

gcc -o hello hello.c

#2 略微复杂

hello:hello.o

gcc -o hello hello.o

hello.o:

gcc -o hello.o -c hello.c

#3 进一步完好

hello:hello.o

gcc -o hello hello.o

hello.o:

gcc -o hello.o -c hello.c

clean:

rm -rf hello.o  #delete file hello.o

#4 在Mackfile中运行shell命令[@符号:不输出命令本身]

hello:hello.o

gcc -o hello hello.o

@echo "--------------ok------------"

hello.o:

gcc -o hello.o -c hello.c

clean:

rm -rf hello.o  #delete file hello.o

#5 综合[.PHONY:#显示声明伪目标]

.PHONY: clean

main: main.o sub.o add.o

gcc -Wall -g -o main main.o sub.o add.o

main.o: main.c

gcc -Wall -g -o main.o -c main.c

add.o: add.c add.h

gcc -Wall -g -o add.o -c add.c

sub.o: sub.c sub.h

gcc -Wall -g -o sub.o -c sub.c

clean:

rm -f main.o sub.o add.o

运行:

1)make #生成第一个目标

2)make clean #“生成”clean伪目标

3)make main.o #仅生成main.o目标

4)make -f Mackfile #显示指定运行的文件名称

Makefile变量

为了简化和维护Mackfile,能够在Mackfile中使用变量,格式

varname=some_text

引用变量的值:$(varname)

依照惯例,在Mackfile中,变量一般大写

Makefile自己主动化变量

选项名

作用

$@

规则的目标文件名称

$<

规则的第一个依赖文件名称

$^

规则的全部依赖文列表

$*

不包含后缀名的当前依赖文件名称

$?

当前目标所依赖的文件列表中比当前目标文件还要新的文件

#综合演示样例

.PHONY: clean

.SUFFIXES: .c .o

.c.o:

gcc -Wall -g -o $@ -c $^

OBJECTS = main.o sub.o add.o

SOURCES = $(OBJECTS:.o=.c)

main: $(OBJECTS)

gcc -Wall -g -o $@ $^

clean:

@echo "delete execute file and object file..."

rm -f $(OBJECTS) main

附-

.SUFFIXES:.c .o #表示不论什么x.c文件与x.o文件关联

Make使用隐含推导规则/生成多个可运行文件

#演示样例-生成多个可运行文件1

.PHONY: clean all

BIN = 01test 02test

all: $(BIN)

clean:

-rm -f $(BIN)

#演示样例-生成多个可运行文件2-使用自己定制的规则,生成.o中间文件

.PHONY: clean all

BIN = 01test 02test

OBJECTS = $(BIN:=.o)

all: $(BIN)

01test.o: 01test.c

02test.o: 02test.c

clean:

-rm -f $(BIN) $(OBJECTS)

#演示样例-生成多个可运行文件3-使用更加仔细的规则

.PHONY: clean all

CFLAGS = -g -Wall

CC = gcc

BIN = 01test 02test

OBJECTS = $(BIN:=.o)

.SUFFIXES: .c .o

.c.o:

$(CC) $(CFLAGS) -c $< -o $@

all: $(BIN)

01test.o: 01test.c

02test.o: 02test.c

clean:

-rm -f $(BIN) $(OBJECTS)

模式规则与后缀规则

%.o:%.c

.c.o:

#演示样例

.PHONY: clean all

CC = gcc

CFLAGS = -Wall -g

BIN = 01test 02test

SOURCES = $(BIN:=.c)

OBJECTS = $(BIN:=.o)

all: $(BIN)

01test: 01test.o

02test: 02test.o

#%.o: %.c #模式规则

#   $(CC) $(CFLAGS) -c $< -o $@

.c.o: #后缀规则,与前作用同样

$(CC) $(CFLAGS) -c $< -o $@

clean:

-rm -rf $(BIN) $(OBJECTS)

Makefile学习(一)[第二版]的更多相关文章

  1. Makefile学习(二)[第二版]

    复杂实例 #演示样例1:在上一个演示样例的基础上再添加一个可运行文件03test[改动之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = ...

  2. Makefile学习(三)[第二版]

    make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当 ...

  3. TensorFlow 深度学习中文第二版·翻译完成

    原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...

  4. gcc学习(一)[第二版]

    gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C  Compiler),作者为Richard Stallman,是GNU项目的奠基者 ...

  5. gdb学习(一)[第二版]

    概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...

  6. gdb学习(二)[第二版]

    查看运行时数据 print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype "aaa" 打印字符串"aaa"的类型 #ptype  ...

  7. gcc学习(二)[第二版]

    头文件与库文件 1.概要 在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明. 库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的.它 ...

  8. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...

  9. Learning ROS for Robotics Programming - Second Edition(《学习ROS机器人编程-第二版》)

    Learning ROS for Robotics Programming - Second Edition <学习ROS机器人编程-第二版> ----Your one-stop guid ...

随机推荐

  1. Xamarin 安装教程 支持Visual Studio 2013

    本文的前提是你已经正确的安装了VS 2013. 本文的全部步骤在Win7 Ultimate 64系统上測试通过.支持VS 2013,我用的版本号是VS 2013 update2. 安装 1.      ...

  2. DelphiXE7中创建WebService(服务端+客户端) good

    相关资料:http://www.2ccc.com/news/Html/?1507.html DelphiXE7新建WebService具体操作:1.打开“DelphiXE7”->“File”-& ...

  3. 计算机视觉与模式识别代码合集第二版three

    计算机视觉与模式识别代码合集第二版three     Topic Name Reference code Optical Flow Horn and Schunck's Optical Flow   ...

  4. 【图像处理】Bilinear Image Scaling

    Bilinear image scaling is about the same as nearest neighbor image scaling except with interpolation ...

  5. sprintf,多少钱你知道?

    选<CSDN 社区电子杂志——C/C++杂志>http://emag.csdn.net 2005 年1 月 总号1 期 - 93 -笔者:steedhorse(晨星)printf 可能是很 ...

  6. Android开发人员必知的开发资源

    developer.android.com 官方开发人员网站推荐资源 在动手编写第一个 Android 应用之前,用心读一读 Android Design 章节.尤其是以下的这些文章: Devices ...

  7. Matlab图像彩色转灰色

    Matlab图像彩色转灰色 时间:2014年5月7日星期三 网上找的程序.实现图像彩色转灰色: I1=imread('C:\Users\Yano\Desktop\matlab\test1\4.jpg' ...

  8. SVN最有效的方法打基线

    笔者:张克强    在微博上:张克强-敏捷307 2014/7/6 方法一来自于我的一条微博: 组织级scm建一个名为controlled的文件夹,当项目某文档通过评审后,组织级scm从项目文件夹下找 ...

  9. Xcode如何添加字体库--

    1.网上搜索字体文件(后缀名为.ttf,或.odf) 2.把字体库导入到工程的resouce中 3.在程序viewdidload中加载一下一段代码 NSArray *familyNames = [UI ...

  10. zoj3747(递推dp)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170 题意:给n个士兵排队,每个士兵三种G.R.P可选,求至少有m个 ...