目录
一、Makefile用法及变量(自定义变量、自动变量、隐含变量)
1. Makefile的概述及基本语法
(1)Makefile的重要性
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
(2)Makefile概述
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
- “自动化编译”:一旦写好(Makefile文件中的‘M’可大写可小写,优先执行小写),只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
- 提升编译效率:再次编译,只编译修改的文件
(3)Makefile基本语法
target... : prerequisites ...
<tab> command
- target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
- prerequisites就是,要生成那个target所需要的文件或是目标。
- command也就是make需要执行的命令。(任意的Shell命令)
未使用伪目标
加上伪目标
2. Makefile的变量
(1)Makefile创建变量的目的
用来代替一个文本字符串:
- 系列文件的名字
- 传递给编译器的参数
- 需要运行的程序
- 需要查找源代码的目录
- 你需要输出信息的目录
- 你想做的其它事情。
(2)自定义变量
x = a 变量在声明时需要给予初值
$(x)或${x} 取值
如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。
(3)变量的赋值
(4)自动变量
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
3. Makefile的隐含变量
AR 库文件维护程序的名称,默认值为ar。
AS 汇编程序的名称,默认值为as。
CC C编译器的名称,默认值为cc。
CPP C预编译器的名称,默认值为$(CC) –E。
CXX C++ 编译器的名称,默认值为g++。
FC FORTRAN编译器的名称,默认值为f77
RM 文件删除程序的名称,默认值为rm -f
ARFLAGS 库文件维护程序的选项,无默认值。
ASFLAGS 汇编程序的选项,无默认值。
CFLAGS C编译器的选项,无默认值。
LDFLAGS 链接器的选项,无默认值
CPPFLAGS C预编译的选项,无默认值。
CXXFLAGS C++编译器的选项,无默认值。
FFLAGS FORTRAN编译器的选项,无默认值
二、Makefile条件判断及函数使用
1. Makefile的条件判断
ifeq 判断是否相等
ifneq 判断是否不相等
ifdef 判断是否定义过(定义切赋值了才算定义过)
ifndef 判断是否未定义过
2. Makefile的函数
(1)Makefile常用函数
基本语法:
$(<function> <arguments>)
或是
${<function> <arguments>}
$(wildcard PATTERN)
功能:列出当前目录下所有符合模式“PATTERN”格式的文件名。
返回:空格分割的、存在当前目录下的所有符合模“PATTERN”的文件名。
说明:“PATTERN”使用shell可识别的通配符,包括“?”(单字符)、“*”(多字符)等。
示例:$(wildcard *.c)返回值为当前目录下所有.c源文件列表。
$(patsubst <pattern>,<replacement>,<text>)
名称:模式字符串替换函数。
功能:查找 <text> 中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式 <pattern> ,如果匹配的话,则以 <replacement> 替换。这里, <pattern> 可以包括通配符 % ,表示任意长度的字串。如果 <replacement> 中也包含 % ,那么, <replacement> 中的这个 % 将是 <pattern> 中的那个 % 所代表的字串。(可以用 \ 来转义,以 \% 来表示真实含义的 % 字符)
返回:函数返回被替换过后的字符串。
示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把字串 x.c.c bar.c 符合模式 %.c 的单词替换成 %.o ,
返回结果是 x.c.o bar.o
(2)Makefile自定义函数
示例:
$(call <expression>,<parm1>,<parm2>,<parm3>...)
例题:
有以下代码,编写一个makefile文件来编译它们:
文件fun1.c :
#include
void myprintf1()
{
printf("fun1!\n");
}
文件fun2.c:
#include
void myprintf2()
{
printf("fun2!\n");
}
文件head.h:
void myprintf1();
void myprintf2();
文件fun.c:
#include "head.h"
int main(int argc, const char *argv[])
{
myprintf1();
myprintf2();
return 0;
}
三、make的使用及练习
-C dir读入指定目录下的Makefile
-f file读入当前目录下的file文件作为Makefile
-i 忽略所有的命令执行错误
-n 只打印要执行的命令,但不执行这些命令
-s 在执行命令时不显示命令
-w 如果make在执行过程中改变目录,打印当前目录名