简单介绍

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. 介绍一个C++奇巧淫技

    你能实现这样一个函数吗:   MyType type;   HisType htype;   serialize_3(11, type, htype);   serialize_4(type, hty ...

  2. brutal是什么意思_brutal在线翻译_英语_读音_用法_例句_海词词典

    brutal是什么意思_brutal在线翻译_英语_读音_用法_例句_海词词典 brutal

  3. 动态拼接lambda表达式树

    前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...

  4. 关于matlab矩阵卷积conv2和傅里叶变换求卷积ifft2的关系

    先定义两个矩阵 a = [1 2 3 5 ; 4 7 9 5;1 4 6 7;5 4 3 7;8 7 5 1] %a矩阵取5*4 b = [1 5 4; 3 6 8; 1 5 7]   %b矩阵如多数 ...

  5. Mars之android的Handler(2)

    handler .looper.messageque的关系在前面已经有个介绍,但前面handler(1)中handler的使用是极少的一种情况,因为handler.sendMessage()可以在Ma ...

  6. 该项目的建设maven片:4.协调和依赖,spring依赖注入demo

    源码下载 协调 <groupId>com.demo.animal</groupId> <artifactId>animal-core</artifactId& ...

  7. young tableaus

    Young tableaus  这是 Introduction_to_algorithms一个 路学校运动, 我也难倒,互联网没有找到现有的应答. 今天 python 代码贴,供你参考. #! /us ...

  8. Linux 内核升级步骤

    1.解压内核文件包#xz -d linux-3.2.63.tar.xz #tar xvf linux-3.2.63.tar 2.拷贝解压文件到/usr/src#cp -r linux-3.2.63 / ...

  9. Beijing seminar: China shadow banking

    Beijing seminar: China shadow banking-张化桥-财新博客-新世纪的常识传播者-财新网 Beijing seminar: China shadow banking

  10. Linux下安装Python3.3.0

    Linux下安装Python3.3.0_路易_新浪博客 Linux下安装Python3.3.0 (2013-01-08 11:45:37)