7.2.2.3 makefile 的一个具体例子
在这里给读者举一个简单的 makefile 的例子,通过对这个 makefile 的讲解,来巩固前面介绍的相关知识。
INCLUDES =-I/home/nie/mysrc/include \
-I/home/nie/mysrc/extern/include \
-I/home/nie/mysrc/src \
-I/home/nie/mysrc/libsrc \
-I. \
-I..
EXT_CC_OPTS = -DEXT_MODE
CPP_REQ_DEFINES = -DMODEL=tune1 -DRT -DNUMST=2 \
-DTID01EQ=1 -DNCSTATES=0 \
-DMT=0 -DHAVESTDIO
RTM_CC_OPTS = -DUSE_RTMODEL
CFLAGS = -O -g
CFLAGS += $(CPP_REQ_DEFINES)
CFLAGS += $(EXT_CC_OPTS)
CFLAGS +=$(RTM_CC_OPTS)
SRCS = tune1.c rt_sim.c rt_nonfinite.c grt_main.c rt_logging.c \
ext_svr.c updown.c ext_svr_transport.c ext_work.c
OBJS = $(SRCS:.c=.o)
RM = rm – f
CC = gcc
LD = gcc
all: tune1
%.o : %.c
$(CC) -c -o $@ $(CFLAGS) $(INCLUDES) $<
tune1 : $(OBJS)
$(LD) -o $@ $(OBJS) -lm
clean :
$(RM) $(OBJS)
在这个 makefile 中首先定义了十个宏:
' INCLUDES =-I …'( 省略号代表 -I 后面的内容 ) , '-I dirname' 表示将 dirname 所指的目录加入到程序头文件目录列表中去,是在进行预处理过程中使用的参数;
' EXT_CC_OPTS = -DEXT_MODE ' 表示在程序中定义了宏 EXT_MODE ,等价于在源代码写入语句 ' #define EXT_MODE ' ;
接下来的两个宏定义 CPP_REQ_DEFINES 和 RTM_CC_OPTS 起到和 EXT_CC_OPTS 类似的作用;
'CFLAGS =-O -g ' 是编译器的编译选项,表示在编译的过程中对代码进行基本优化,并产生能被GNU 调试器 ( 如 gdb) 使用的调试信息;
'CFLAGS += ' 表示对这个宏定义在原来的基础上增加新的内容;
' SRCS = …' 代表了所有要编译的源代码文件列表;
' OBJS = $(SRCS:.c=.o)' 表示把宏 SRC 所代表的所有以 .c 结尾的文件名用 .o 结尾的文件名替换,即表示各个源文件所对应的目标文件名;
' RM = rm – f ' 表示删除命令, -f 是强制删除选项,使用该符号,在对文件进行删除时,没有提示;
' CC = gcc ' 表示编译器是用 gcc ;
' LD= gcc' 表示链接命令是用 gcc ;
all 和 clean 是两个伪目标,在使用 make 命令的时候,如果不指明目标文件名,则是以在 makefile中出现的第一个目标作为最终目标,所以如果键入命令 make ,则伪目标 all 被作为最终的目标而执行,由于这个文件并不存在,所以 make 会尝试更新 all 规则,因此就检查它的依赖文件 tune1 是否需要更新,如果需要,就把它更新,这样伪目标下面的两条规则就会被执行,从而生成可执行文件 tune1 。如果要执行删除命令,只需要键入命令 make clean ,就会把所有以 .o 结尾的中间文件删除。
另外,请读者注意在本 makefile 的例子中多次用到 ' \' ,该符号用于在 makefile 中,如果一条语句过长时,可以用 ' \' 放在这条语句的右边界,通过回车换行,使下面新一行的语句成为该语句的续行。
在 makefile 文件中,用符号 ' #' 作为注释行语句的开始,以增强 makefile 文件的可读性。
本例假设 makefile 文件名为 makefile ,当然也可按照个人的喜好取其他文件名,如果文件名不是 makefile , Makefile 的话,在用 make 命令是,请使用 make – f makefilename 。到此,希望读者能够掌握 make 和 makefile 的基本使用。
