博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Makefile教程(二)
阅读量:3522 次
发布时间:2019-05-20

本文共 1588 字,大约阅读时间需要 5 分钟。

注意:文档中的Makefile尽量不要复制 容易出问题

特殊变量

  • $@:当前目标
  • $^:当前规则中的所有依赖
  • $<:依赖中的第一个
  • $$:当前执行的进程编号
  • $*:模式规则中所有%匹配的部分
  • $?:模式规则中所有比目标更新的文件列表
test: A B C        @echo '$$@ = ' $@       #$@ 当前目标        @echo '$$^ = ' $^       #$^ 当前规则中的所有依赖        @echo '$$< = ' $<       #$< 依赖中的第一个        @echo '$$$$ = ' $$$$ #$$ 当前执行的进程编号        @echo '$$* = ' $*   #$* 模式规则中所有%匹配的部分        @echo '$$? = ' $?   #$? 模式规则中所有比目标更新的文件列表A:        touch AB:        touch BC:        touch C

输出结果:

$@ = test
$^ = A B C
$< = A
$$ = 17678
$* =
$? = A B C

利用特殊变量 优化Makefile

#a.out: main.c test.c#       gcc main.c test.cTGT = a.outSRCS = main.c test.c $(TGT): $(SRCS)        gcc $^ -o $@clean:        rm -f $(TGT)

升级写法

TGT = a.outSRCS = main.c test.cOBJ = main.o test.oCC = gcc$(TGT): $(OBJ)	$(CC) $^ -o TGT	main.o: main.c	$(CC) -c $^ -o $@test.o: test.c	$(CC) -c $^ -o $@clean:	rm -f $(TGT) $(OBJ)

再升级 (模式规则 %.o %.c…)

模式规则中记得要用$<(依赖中的第一个)

TGT = a.outSRCS = main.c test.cOBJ = main.o test.oCC = gcc$(TGT): $(OBJ)	$(CC) $^ -o $@%.o: %.c	$(CC) -c $< -o $@ # 这个%.o应该是对应一个匹配的文件  所以后面加上 -o $@ 也是没问题的 不写也是没问题的(默认就会生成%.o)clean:	rm -f $(TGT) $(OBJ)

优化

TGT = a.outSRCS = main.c test.cCC = gcc# 将源文件中的.c生成.o$(TGT): $(SRCS:.c=.o)	$(CC) $^ -o #@# 模式规则是一个循环取出的过程,每次取出一个.c,然后调用命令生成.o,直到将所有的.c取完为止%.o: %.c	$(CC) -c $<  		clean:	rm -f $(TGT) $(SRCS:.c=.o)

隐含规则:可以通过命令make -p打印出所有的隐含规则

#%.o: %.c#	$(CC) -c $< # 这条规则可以不写 因为make会自动根据.o查找对应的.c文件编译生成.o 这就是隐含规则
在模式规则中,必须用$< ? 经过测试 使用$^和$

输出结果:

zys@ubuntu:~/linux/application/makefile/p4$ make
gcc -c main.c -o main.o
main.o
main.c
main.c
gcc -c test.c -o test.o
test.o
test.c
test.c
gcc main.o test.o -o a.out

转载地址:http://uxqqj.baihongyu.com/

你可能感兴趣的文章
java中对象的类型转换
查看>>
java基础入门 String
查看>>
Java基础入门 StringBuffer类
查看>>
Java基础入门 currentTimeMillis方法
查看>>
Java基础入门 arraycopy方法
查看>>
Java基础入门 Math类
查看>>
Java基础入门 Random类
查看>>
Java基础入门 Date类
查看>>
Java基础入门 Calendar类
查看>>
Java基础入门 DateFormat类
查看>>
Java基础入门 Window类及Panel类
查看>>
Java基础入门 AWT事件处理
查看>>
Java基础入门 鼠标事件
查看>>
Java基础入门 键盘事件
查看>>
Java基础入门 GridLayout
查看>>
JavaEE Bean的两种常用作用域 singleton(单例)和prototype(原型)
查看>>
MySQL 数据库索引
查看>>
JavaEE Spring与MyBatis的整合之传统DAO方式整合(教材学习笔记)
查看>>
JavaEE MyBatis与Spring的整合——基于mapper接口方式开发(教材学习笔记)
查看>>
JavaWeb 使用Cookie实现——显示用户上次访问时间(教材学习笔记)
查看>>