全部博文(77)
分类: LINUX
2009-03-09 11:35:32
假设我们有一个程序由5个文件组成,源代码如下: /*main.c*/ #include "mytool1.h" #include "mytool2.h" int main() { mytool1_print("hello mytool1!"); mytool2_print("hello mytool2!"); return 0; }
/*mytool1.c*/ #include "mytool1.h" #include <stdio.h> void mytool1_print(char *print_str) { printf("This is mytool1 print : %s ",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 ",print_str); } /*mytool2.h*/ #ifndef _MYTOOL_2_H #define _MYTOOL_2_H void mytool2_print(char *print_str); #endif 首先了解一下make和Makefile。GNU make是一个工程管理器,它可以管理较多的文件。我所使用的RedHat 9.0的make版本为GNU Make version 3.79.1。使用make的最大好处就是实现了“自动化编译”。如果有一个上百个文件的代码构成的项目,其中一个或者几个文件进行了修改,make就能够自动识别更新了的文件代码,不需要输入冗长的命令行就可以完成最后的编译工作。make执行时,自动寻找Makefile(makefile)文件,然后执行编译工作。所以我们需要编写Makefile文件,这样可以提高实际项目的工作效率。 在一个Makefile中通常包含下面内容: 1、需要由make工具创建的目标体(target),通常是目标文件或可执行文件。 格式如下: target:dependency_files <TAB>command target:规则的目标。通常是程序中间或者最后需要生成的文件名,可以是.o文件、也可以是最后的可执行程序的文件名。另外,目标也可以是一个make执行的动作的名称,如目标“clean”,这样的目标称为“伪目标”。 dependency_files:规则的依赖。生成规则目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。
下面就可以写出第一个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 main 在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 This is mytool1 print : hello mytool1! This is mytool2 print : hello mytool2! 这只是最为初级的Makefile,现在来对这个Makefile进行改进。 改进一:使用变量 一般在书写Makefile时,各部分变量引用的格式如下: 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看到一个.o文件,它就会自动的把对应的.c文件加到依赖文件中,并且gcc -c .c也会被推导出来,所以Makefile就简化了。 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) 这些是最为初级的知识,现在至少可以减少编译时的工作量。细节方面的东西还需要在以后的工作和学习中不断的总结,不断的深化理解。可以 参考GNU Make手册,这里讲解的比较全面。 |