Makefile
使用GCC的命令进行程序编译时,当程序是单个文件时编译是比较方便的,但当工程中的文件数目增多,甚至非常庞大,并且目录结构关系复杂时,便需要通过makefile来进行程序的编译。
示例:
目录MakeFile_Demo下有三个文件来合作进行加减乘除的计算
使用Makefile编译:
Makefile中代码格式:
目标对象:依赖对象
要生成目标对象所执行的命令
Makefile文件中的代码分析为:
第1行:最终要生成的目标文件Calculate文件依赖于main.o文件和calculate.o文件
第2行:gcc方式编译代码,目标文件是Calculate,源文件是main.o和calculate.o
第3行:生成Calculate文件所依赖的文件main.o又依赖于main.c
第4行:gcc方式编译生成目标文件main.o
第5行:生成Calculate文件所依赖的文件calculate.o又依赖于calculate.c
第6行:gcc方式编译生成目标文件calculate.o
第7行:.PHONY后面的clean表示的是一个伪造的目标,并不是真正目标文件的依赖
第8行:目标对象clean不依赖于任何依赖对象,因为clean是一个伪目标
第9行:生成clean要执行的代码,即调用make clean命令时,执行代码rm –rf *.o Calculate
使用Makefile中特殊符号编译:
$@ 代表目标文件
$^ 代表所有的依赖文件
$< 代表第一个依赖文件
执行过程和结果与第一种编译方式相同。
使用变量编译:
wildcard:获取匹配模式的文件名函数
格式:$(wildcard PATTERN)
此函数的功能是查找当前目录下所有符合模式PATTERN的文件名,其返回值是以空格分割的、当前目录下的所有符合模式PATTERN的文件名列表。
例如:返回当前目录下所有扩展名为.c的文件列表
$(wildcard *.c)
patsubst:模式替换函数
格式:$(patsubst pattern,replacement,text)
此函数的功能是查找字符串text中按照空格分割的单词,将符合模式pattern的字符串替换成replacement。函数的返回值是替换后的新字符串。
例如:将.c文件替换为.o文件
$(patsubst %.c,%.o,$(wildcard *.c))
输出的字符串将当前扩展名为.c的文件替换为.o的文件列表。
运行过程和结果与前两种方式相同。