总结的makefile,只求自己下次看的时候还能懂

深入理解Makefile:构建过程与高级特性
本文详细解析Makefile的基本构成、命令行属性、依赖类型、特殊目标及高级特性,包括伪命令、搜索目录、使用变量、条件语句和默认变量等。深入探讨了Makefile如何实现高效构建过程,并提供了实例演示。

1.Makefile的基本构成
目标文件列表 分隔符 依赖文件列表 [:命令]
[命令]
[命令]
提示:书上说[命令]之前的空格是制表符,而且是必须的

main:main.o module1.o module2.o
gcc main.o module1.o module2.o -o main
main.o:main.c head1.h head2.h
gcc -c main.c
module1.o:module1.c head1.c
gcc -c module1.c
module2.o:module2.c head2.c
gcc -c module2.c

可以不把依赖文件取名为makefile,假如取名othername
make -f othername
make –file=othername

makefile文件的简写

main:mian.o module1.o module2.o
gcc main.o module1.o module2.o -o main
main.o:head1.h head2.h common_head.h
module1.o:head1.h
module2.o:head2.h

依赖类型
foo:foo.c |somelib
gcc -o foo.c somelib
‘|’之前的文件过时,foo文件将重构,’|’文件之后的文件过时将不重构

命令行属性
- 遇到错误,继续执行,不退出make
+ 本命令始终执行(前提是本命令所在规则的目标文件已经过时)
@ 不打印执行命令的内容

file.o:file.c head1.c head2.c
-mv file.o /tmp
gcc -c file.c

特殊目标

伪命令
.PHONY :clean
clean:
-rm -f *.o

.IGNORE
类似于 -
忽略错误继续执行

.SUFFIXES
该目标的依赖被认为是一个后缀列表

.SILENT
相当于 @
如果.SILENT后面没有依赖文件.则Makefile中的所有命令都不会打印

.PRECIOUS
遇到特殊情况,与他有关的文件不会被删除

.INTERMEDIATE
其依赖文件被当成被当成中间文件对待

搜索目录

VPATH = /usr/src:/lib/include/….
(1)
VPATH pattern directories
为符合pattern的文件指定搜索目录directories
(2)
VPATH pattern
清除符合pattern的文件的搜索目录
(3)
VPATH
清除所有的以被设置的文件搜索目录

例子:
“%” :意思是%匹配零或若干的字符
vpath %.h ../headers

vpath %.c src1
vpath src2
vpath %.c src3
以.c结尾的文件现在src1目录中找,然后是src2,最后是src3

vpath %.h headers:src
vpath % usr
以.h结尾的文件先是在headers,然后是src,最后是usr

使用变量

引用变量
$(foo)

定义变量
(1)递归展开变量
foo = $(bar)
bar = $(ugh)
ugh = Huh
all:
echo $(foo)

(2)立即展开变量,,,在使用之前必须已经存在
x := foo
y := $(x) bar
x := later

(3)条件赋值符…这个变量之前没有赋值过,才能赋值
FOO ?= bar

(4)追加赋值
objects = main.o foo.o bar.o utils.o
objects += another.o

预定义变量

|宏名|初始值|说明|
|…………….|:………….:|………………………………………:|
| CC | cc | 默认使用的编译器|
| CFLAGS | -o | 编译器使用的选项|
| MAKE | make | make命令 |
|MAKEFLAGS |空|make命令的选项|
|SHELL| | 默认使用的Shell类型选项|
|PWD| | 运行make命令时的当前目录|
|AR| ar | 库管理命令|
|ARFLADS| -ruv |库管理命令选项|
|LIBSUFFIXE| .a |库的后缀|
|A| a |库的扩展后缀|

默认变量…..(跟perl有点像)
$@:表示一个规则中的目标文件名…多目标规则
$%:当规则的文件是一个静态库文件时$%代表静态库的一个成员变量
$<:规则中第一个依赖文件名
$>:表示库名
$?:所有比目标文件新的依赖文件列表
$^:规则的所有文件列表,取出重复的
$+:类似$^,但是保留重复的
$*:目标文件去除后缀后的名称

隐含规则

与C语言有关的扩展名
.c
.h
.o

使用条件语句

libs_for_gcc = -gnu
normal_libs =
ifeq($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
foo:foo.c
$(CC) -o foo foo.c $()

还有关键字
ifdef- - - - - - - - - - - - - - - - - - - - ifndef

使用库

库名(成员名)
mylib.a(file.o)
.a是静态库
.so是动态文件库
将file.o文件放入mylib中
mylib:mylib(file.o)
gcc -c file.c
ar -ruv mylib file.c
rm -f file.o

make的命令行参数

用的时候man make自己查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值