《跟我一起写Makefile》学习笔记(八)

1.隐含规则
“隐含规则”也就是一种惯例,make会按照这种“惯例”心照不喧地来运行,那怕我们的Makefile中没有书写这样的规则

2.使用隐含规则
要使用隐含规则生成你需要的目标,你所需要做的就是不要写出这个目标的规则,make会在自己的“隐含规则”库中寻找可以用的规则,如果找到,那么就会使用。如果找不到,那么就会报错。
如果我们写了自己的规则,那么make就不会自动推导并调用隐含规则,它会按照我们写好的规则忠实地执行

3.隐含规则一览
1)、编译C程序的隐含规则。

“;.o”的目标的依赖目标会自动推导为“;.c”,并且其生成命令是“$(CC) –c $(CPPFLAGS) $(CFLAGS)”
2)、编译C++程序的隐含规则。

“;.o”的目标的依赖目标会自动推导为“;.cc”或是“;.C”,并且其生成命令是 “$(CXX) –c $(CPPFLAGS) $(CFLAGS)”。(建议使用“.cc”作为C++源文件的后缀,而不是“.C”)
.
.
.
7)、汇编和汇编预处理的隐含规则。

“;.o” 的目标的依赖目标会自动推导为“;.s”,默认使用编译品“as”,并且其生成命令是:“$ (AS) ( A S F L A G S ) < n > ; . s < n > ; . S 使 C c p p (ASFLAGS)”。“<n>;.s” 的目标的依赖目标会自动推导为“<n>;.S”,默认使用C预编译器 “cpp”,并且其生成命令是:“ (AS) $(ASFLAGS)”。

8)、链接Object文件的隐含规则。

“;”目标依赖于“;.o”,通过运行C的编译器来运行链接程序生成(一般是“ld”),其生成命令是: “$(CC) $(LDFLAGS) ;.o $(LOADLIBES) $(LDLIBS)”。这个规则对于只有一个源文件的工程有效,同时也对多个Object文件(由不同的源文件生成)的也有效。
.
.
.

4.隐含规则使用的变量
1).关于命令的变量
AR,AS,CC…
2).关于命令参数的变量
ARFLAGS,ASFLAGS,CFLAGS…

5.定义模式规则
1).你可以使用模式规则来定义一个隐含规则
语法:

 %.o : %.c ; <command ......>;

示例

   %.o : %.c
           $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

2).自动化变量

3).重载内建隐含规则
例如你可以重新构造和内建隐含规则不同的命令,如:

   %.o : %.c
           $(CC) -c $(CPPFLAGS) $(CFLAGS) -D$(date)

你可以取消内建的隐含规则,只要不在后面写命令就行。如:

%.o : %.s

6.老式风格的"后缀规则"
如".c.o"相当于"%o : %c"
如".c"相当于"% : %.c"

   .c.o:
           $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

猜你喜欢

转载自blog.csdn.net/qq_36412526/article/details/87790864