Makefile学习(一)[第二版]

简介

1)make:利用 make 工具可以自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件[make通过比对相应的.c文件与.o文件的时间];如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。

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

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自动化变量


选项名


作用


[email protected]


规则的目标文件名


$<


规则的第一个依赖文件名


$^


规则的所有依赖文列表


$*


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


$?


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

#综合示例

.PHONY: clean

.SUFFIXES: .c .o

.c.o:

gcc -Wall -g -o [email protected] -c $^

OBJECTS = main.o sub.o add.o

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

main: $(OBJECTS)

gcc -Wall -g -o [email protected] $^

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 [email protected]

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 [email protected]

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

$(CC) $(CFLAGS) -c $< -o [email protected]

clean:

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

时间: 2024-10-12 22:40:06

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

Makefile学习(三)[第二版]

make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当前目录下的文件 例如:src=$(wildcard *.c) #匹配当前目录下所有的.c文件 2)$(patsubst PATTERN,REPLACEMENT,TEXT) #模式替换函数 例如:$(patsubst %.c,%.o,$src) #等价于$(src:%.c=%.o)[常用] 3)she

gcc学习(一)[第二版]

gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C  Compiler),作者为Richard Stallman,是GNU项目的奠基者;现在已经支持多种语言,如C.C++.Java.Pascal.Ada.COBOL语言等 . 2.主要特征: gcc是一个可移植的编译器,支持多种硬件平台,甚至对Don Knuth 设计的 MMIX 这类不常见的计算机都提供了完善的支持 gcc不仅仅是个本地编译器,它还能跨平台交叉编译(在本地编译的程

gdb学习(二)[第二版]

查看运行时数据 print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype "aaa" 打印字符串"aaa"的类型 #ptype array 打印数组array的类型 #ptype main 打印main函数的类型 print array – 查看数组 #p arr1 #p arr1[2] 查看数组arr2第三个元素值 #p &arr1[2] 打印数组元素的地址 #p &arr1 打印数组首地址,与p &arr1

gcc学习(二)[第二版]

头文件与库文件 1.概要 在使用C语言和其它语言进行程序设计的时候,我们须要头文件来提供对常数的定义和对系统及库函数调用的声明. 库文件是一些预先编译好的函数集合,那些函数都是依照可重用原则编写的.它们通常由一组互相关联的用来完毕某项常见工作的函数构成.比方用来处理屏幕显示情况的函数(ncurses库)和数据库訪问例程(dbm库)等. 2.使用库的长处: 1)模块化开发 2)可重用性 3)可维护性 3.头文件与库文件的位置 /usr/include及其子文件夹底下的include文件夹 /usr

学习bash第二版 学习笔记 1 —— bash的简介、检测和安装

shell 区别于内核 是一款命令解析程序. Bourne Again shell (BASH), 创建用于GNU项目. GNU项目由Free Software Foundation(FSF)的Richard Stallman 始创,用于创建一个UNIX兼容的操作系统, 并使用该免费的发布版本替代所有的商业UNIX版本. ?? 你可能不能马上用bash.你的系统管理员可能将你的账号设置为使用系统上的 "标准" shell,你甚至不知道有没有其他shell可用. ?? 键入 echo $

python基础学习05(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #dict{键:值} #哈希 #注:字典是无顺序的,所以你懂的 #创建与赋值 dict1={} dict2={'name':'apply','avg':24,'sex':'man'} print dict1,dict2

《lua程序设计(第二版)》学习笔记(二)

直接上代码 1: -- 第2章 类型与值 2: -- 动态类型的语言,每个值都携带自身类型信息 3: print("类型打印,每个值都携带自身类型"); 4: print(type("Hello world")); -- string 完全采用8位编码,字符可以具有任何数值编码,可以将任意二进制数据存储到字符串中 5: --[[ 6: string是不可变值,不能像C一样修改一个字符创中某个字符,而是应该 7: 创建一个新的字符串; 8: 和其他对象一样,都是自动内

Lua程序设计(第二版)学习笔记(一)

前段时间认真的看了一下<lua程序设计(第二版)>这本书,每一章写一个lua脚本,诸多注释,相信给初学者有一定帮助. -- 第一章代码 print("hello Hello"); -- 全局函数 function face(n) if n == 0 then return 1 else return n + face(n - 1) end end print(face(100)); -- 1.1 程序快(chunk) -- 每段代码,源代码文件或者交互模式 的 一行 代码,

《python基础教程(第二版)》学习笔记 字符串(第3章)

<python基础教程(第二版)>学习笔记 字符串(第3章)所有的基本的序列操作(索引,分片,乘法,判断成员资格,求长度,求最大最小值)对字符串也适用.字符串是不可以改变的:%左侧是格式字符串,右侧是需要格式化的值print '%s=%d' % ('x',100) ==> x=100%% 格式字符串中出现 %模板字符串:from string import Templates=Template('$x is 100');  s.substitute(x='ABC');  ==> '