makefile笔记

• 1.常见自动变量和含义
• * :表示目标文件的名称,不包含目标文件的扩展名。
• + :表示所有的依赖文件,这些依赖文件之间以空格分开,按照出现的先后为顺序,其中可能包含重复的依赖文件。
• < :表示依赖项中第一个依赖文件的名称
• ? : 依赖项中,所有目标文件时间戳晚的文件(表示修改过),依赖文件间以空格分开
• @ :目标项中目标文件的名称
• ^ :依赖项中,所有不重复的依赖文件,以空格分开。

• 笔记内容来自https://seisman.github.io/how-to-write-makefile/index.html 跟我一起写makefile
• 自动生成依赖
• 加入 -M选项 例如
• main.o : main .c main.h
• cc -M main.c
• 如果使用的是GUN的C/C++编译器,需要用-MM参数,否则-M会吧一些标准库的头文件也包含进来
• 显示命令
• 可以直接用echo 时候输出
• 在make执行时 如果 带上后缀 -n 或者–just–print 那么只会显示命令,并不会执行
• 命令出错
• 忽略出错命令的话,可以再makefile的命令行前加一个-,标记为不管命令处不出错都认为是成功的
• 嵌套执行make

  • cd sudbir && $(MAKE)
  • $(MAKE) -C subdir

上面两个的意思都是子目录下有一个subdir的子目录,里面有个Makefile,进入这个目录来执行编译
• 传递变量到下级Makefile中
• export variable=value 或者 export variable := value 或者 export variable += value 以上三个内容作用相同
• 如果要传递所有变量 只要export 就行了
• 其中SHELL和MAKEFLAGS 这两个变量 不管是否export 总是传递到makefile中,都是系统级别的环境变量
• 变量定义
• FOO ?= bar 表示 如果foo没有被定义过的话,讲bar复制给foo 如果赋值过了 什么也不错,等同于下面代码
ifeq ($(origin FOO), undefined)
FOO = bar
endif
• 高级变量用法
• 变量值替换
• foo := a.o b.o c.o
• bar := $(foo:.o=.c)
• 这个示例中,我们先定义了一个 $(foo) 变量,而第二行的意思是把 $(foo) 中所有以 .o 字串“结尾”全部替换成 .c ,所以我们的 $(bar) 的值就是“a.c b.c c.c”。
• 追加变量值
• 利用+= 操作符给变量追加值
• 如果变量之前没有定义过,+=会自动变成=,如果前一次是:= ,那么+=会以:=为其赋值。
• 多行变量
• define后紧跟变量名,再起一行是值,以endef结束,命令变量中没有tab键,所以make不会吧其认为是命令
define two-lines
echo foo
echo $(bar)
endef
• 你最好不要把自动化变量(如 $@ 等)放入条件表达式中,因为自动化变量是在运行时才有的。
• 函数
• 字符串处理函数 subst
• $(subst ,, )
• 把字串 中的 字符串替换成 。
• shell函数
• contents := $(shell cat foo)
• error 函数
• $(error <text…>)产生一个致命错误,<text …>是错误信息,error函数不会子一被使用时就会产生错误信息,出现错误后停止
• $(warning <text …>) 产生一个警告信息,继续执行
• make的运行
• make退出码
• 0 表示执行成功 1 表示错误 2如果使用了make -q的选项 ,使得make的一些目标不需要更新返回2
• 执定makefile make -f hche.mk
• 隐含规则
a. 编译C程序的隐含规则。
.o 的目标的依赖目标会自动推导为 .c ,并且其生成命令是 $(CC) –c $(CPPFLAGS) $(CFLAGS)
b. 编译C++程序的隐含规则。
.o 的目标的依赖目标会自动推导为 .cc 或是 .C ,并且其生成命令是 $(CXX) –c $(CPPFLAGS) $(CFLAGS) 。(建议使用 .cc 作为C++源文件的后缀,而不是 .C )
c. 汇编和汇编预处理的隐含规则。
.o 的目标的依赖目标会自动推导为 .s ,默认使用编译器 as ,并且其生成命令是: $ (AS) $(ASFLAGS) 。 .s 的目标的依赖目标会自动推导为 .S ,默认使用C预编译器 cpp ,并且其生成命令是: $(AS) $(ASFLAGS) 。
d. 链接Object文件的隐含规则。
目标依赖于 .o ,通过运行C的编译器来运行链接程序生成(一般是 ld ),其生成命令是: $(CC) $(LDFLAGS) .o $(LOADLIBES) $(LDLIBS) 。这个规则对于只有一个源文件的工程有效,同时也对多个Object文件(由不同的源文件生成)的也有效。例如如下规则:
x : y.o z.o
a. 并且 x.c 、 y.c 和 z.c 都存在时,隐含规则将执行如下命令:
cc -c x.c -o x.o
cc -c y.c -o y.o
cc -c z.c -o z.o
cc x.o y.o z.o -o x
rm -f x.o
rm -f y.o
rm -f z.o
a. 如果没有一个源文件(如上例中的x.c)和你的目标名字(如上例中的x)相关联,那么,你最好写出自己的生成规则,不然,隐含规则会报错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值