makefile简单实例 |
假设我们有一个程序由5个文件组成,源代码如下:
/*main.c*/ #include "mytool1.h" #include "mytool2.h" int main() { mytool1_print("hello mytool1!"); mytool2_print("hello mytool2!"); return0; } /*mytool1.c*/ #include "mytool1.h" #include <stdio.h> void mytool1_print(char*print_str) { printf("This is mytool1 print : %s\n",print_str); } /*mytool1.h*/ #ifndef _MYTOOL_1_H #define _MYTOOL_1_H void mytool1_print(char*print_str); #endif /*mytool2.c*/ #include "mytool2.h" #include <stdio.h> void mytool2_print(char*print_str) { printf("This is mytool2 print : %s\n",print_str); } /*mytool2.h*/ #ifndef _MYTOOL_2_H #define _MYTOOL_2_H void mytool2_print(char*print_str); #endif 首先了解一下make和Makefile.GNU make是一个工程管理器,它可以管理较多的文件 在一个Makefile中通常包含下面内容: 1、需要由make工具创建的目标体(target),通常是目标文件或可执行文件 2、要创建的目标体所依赖的文件(dependency_file) 3、创建每个目标体时需要运行的命令(command) 格式如下: target:dependency_files <TAB>command target:规则的目标 dependency_files:规则的依赖 command:规则的命令行 在Makefile中"规则"就是描述在什么情况下、如何重建规则的目标文件,通常规则中包括了目标的依赖关系(目标的依赖文件)和重建目标的命令 Makefile中可以包含除规则以外的部分 下面就可以写出第一个Makefile了 main:main.o mytool1.o mytool2.o gcc-o main main.o mytool1.o mytool2.o main.o:main.c mytool1.h mytool2.h gcc-c main.c mytool1.o:mytool1.c mytool1.h gcc-c mytool1.c mytool2.o:mytool2.c mytool2.h gcc-c mytool2.c clean: rm-f *.o 在shell提示符下输入make,执行显示: gcc-c main.c gcc-c mytool1.c gcc-c mytool2.c gcc-o main main.o mytool1.o mytool2.o
执行结果如下: [armlinux@lqm makefile-easy]$ ./main Thisis mytool1 print : hello mytool1! Thisis mytool2 print : hello mytool2! 这里并不会执行Makefile文件里的clean : rm -f *.o语句,执行完make后,在执行make clean,则该命令得到执行 这只是最为初级的Makefile,现在来对这个Makefile进行改进 改进一:使用变量 一般在书写Makefile时,各部分变量引用的格式如下: 1. make变量(Makefile中定义的或者是make的环境变量)的引用使用"$(VAR)"格式,无论"VAR"是单字符变量名还是多字符变量名 2. 出现在规则命令行中shell变量(一般为执行命令过程中的临时变量,它不属于Makefile变量,而是一个shell变量)引用使用shell的"$tmp"格式 3. 对出现在命令行中的make变量同样使用"$(CMDVAR)" 格式来引用 OBJ=main.o mytool1.o mytool2.o make:$(OBJ) gcc-o main $(OBJ) main.o:main.c mytool1.h mytool2.h gcc-c main.c mytool1.o:mytool1.c mytool1.h gcc-c mytool1.c mytool2.o:mytool2.c mytool2.h gcc-c mytool2.c clean: rm-f main $(OBJ) 改进二:使用自动推导 让make自动推导,只要make看到一个 CC= gcc OBJ= main.o mytool1.o mytool2.o make: $(OBJ) $(CC)-o main $(OBJ) main.o: mytool1.h mytool2.h mytool1.o: mytool1.h mytool2.o: mytool2.h .PHONY: clean clean: rm-f main $(OBJ) 改进三:自动变量($^ $< $@)的应用 Makefile 有三个非常有用的变量,分别是$@、$^、$<.代表的意义分别是: $@--目标文件, $^--所有的依赖文件, $<--第一个依赖文件 CC= gcc OBJ= main.o mytool1.o mytool2.o main: $(OBJ) $(CC)-o $@ $^ main.o: main.c mytool1.h mytool2.h $(CC)-c $< #该行可以省略,为了说明符号"<",所以保留 mytool1.o: mytool1.c mytool1.h $(CC)-c $< #该行可以省略,为了说明符号"<",所以保留 mytool2.o: mytool2.c mytool2.h $(CC)-c $< #该行可以省略,为了说明符号"<",所以保留 .PHONY: clean clean: rm-f main $(OBJ) 这些是最为初级的知识,现在至少可以减少编译时的工作量 这里讲解的比较全面,自己研究一下吧! |
makefile简单实例
最新推荐文章于 2024-08-25 17:23:51 发布