通常我们在命令行使用GCC对程序进行编译,如果对于单个或者几个文件时比较方便的,但当工程中的文件逐渐增多甚至变得十分庞大的时候,使用GCC显然力不从心,不好管理。因此我们有必要编写一个Makefile来对工程进行管理。就以下工程目录进行学习。
生成可执行程序cacu,建立如下规则的Makefile文件。 #生成test,":"左边为目标,右边为依赖 。gcc后是命令 cacu:add_int.o add_float.o sub_int.o sub_float.o main.o gcc -o cacu add/add_int.o add/add_float.o \ (连接符) sub_int.o sub_float.o main.o #生成add_int.o的规则 add_int.o:add/add_int.c add/add_int.h gcc -c -o add/add_int.o add/add_int.c #生成add_float.o的规则 add_float.o:add/add_float.c add/add_float.h gcc -c -o add/add_float.o add/add_float.c #生成sub_int.o的规则 sub_int.o:sub/sub_int.c sub/sub_int.h gcc -c -o sub/sub_int.o sub/sub_int.c #生成sub_float.o的规则 sub_float.o:sub/sub_float.c sub/sub_float.h gcc -c -o sub/sub_float.o sub/sub_float.c #生成main.o的规则 main.o:main.c add/add.h sub/sub.h gcc -c-o main.o main.c -Iadd -Isub #清理的规则 clean: rm -f test add_int.o add_float.o sub_int.o sub_float.o main.o Makefile的规则: main. o main. c add/add. h sub/sub. h 4.规则的嵌套 在Makefile中使用用户自定义变量 定义OBJS变量表示目标文件: OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o 在调用OBJS的时候在前面加上$,并且变量的名称可以用括号括起来。例如,使用gcc的默认规则进行编译,cacu的规则可以采用如下形式 cuca:gcc -o cacu $(OBJS) 用CC表示gcc,用CFLAGS表示编译选项,RM表示rm -f ,TARGET表示最终的生成目标cacu。 CC = gcc (CC定义成为gcc) 这样,之前冗长的Makefile可以简化为如下形式。
1 CC = gcc 2 CFLAGS = -Isub -Iadd -O2 (O2为优化) 3 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o 4 TARGET = cacu 5 RM = rm -f 6 $(TARGET):$(OBJS) 7 $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) 8 $(OBJS):%.o:%.c (将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件) 9 $(CC) -c $(CFLAGS) $< -o $@ (生成目标文件) 10 clean: 11 -$(RM) $(TARGET) $(OBJS) - 表示忽略错误 由于CC的默认值已经为cc,RM的默认值为 rm -f,因此,如果在调用这些变量的时候未显式给出变量的定义,编译器就去调用其默认值。经过简化,可以得到以下形式: 1 CFLAGS = -Isub -Iadd -O2 (O2为优化) 2 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o 3 TARGET = cacu 4 $(TARGET):$(OBJS) 5 $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) 6 $(OBJS):%.o:%.c (将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件) 7 $(CC) -c $(CFLAGS) $< -o $@ (生成目标文件) 8 clean: 9 -$(RM) $(TARGET) $(OBJS) - 表示忽略错误 Makefile很智能(会自动推导,使用默认的方式生成目标文件),可以再简化,就可以得到如下形式: 1 CFLAGS = -Isub -Iadd -O2 (O2为优化) 2 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o 3 TARGET = cacu 4 $(TARGET):$(OBJS) 5 $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) 6 clean: 7 -$(RM) $(TARGET) $(OBJS) - 表示忽略错误 Makefile之博大精深,暂时学习到这里(待续)。。。。 |
|
来自: 昵称28625772 > 《Linux开发环境》