Makefile程序编译控制,表明程序应该如何构造,通过多个输入来生成输出文件时,手册页的编写以及将应用程序安装到目标目录,都可以使用Makefile
makefile语法:
文件由一组依赖关系和规则构成,每个依赖由一个目标(将要创建的文件)和一组该目标所依赖的源文件组成。
make命令的选项和参数:
-k 让make命令在发现错误时仍然继续执行,而不是检测到第一个错误时就停止
-n 让make输出将要执行的操作步骤,而不真正执行这些操作
-f <filename> 告诉系统哪个文件时Makefile文件,否则将首先搜索makefile,不存在则搜索Makefile(建议使用)
#Makefile myapp.1是myapp的说明文件 在makefile中生成 all: … 生成所有需要的目标 all: myapp myapp.1
如果不指定all,则makefile只会创建在Makefile中找到的第一个目标
宏: 定义与引用,一般用于替换可能改变的,多出出现的字符串 如编译器(gcc cc c89)之间的切换 debug版本与release版本之间的切换
MACRONAME=value "MACRONAME = value" (在外部调用makefile给定宏定义时,有空格,需要用引号)
${MACRONAME} $(MACRONAME) $MACRONAME 三种,推荐前两种
例子:
all: myapp # Which compiler CC = gcc # Where to install INSTDIR = /usr/local/bin # Where are include files kept INCLUDE = . # Options for development CFLAGS = -g -Wall -ansi # Options for release # CFLAGS = -O -Wall -ansi myapp: main.o 2.o 3.o $(CC) -o myapp main.o 2.o 3.o main.o: main.c a.h $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c 2.o: 2.c a.h b.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c 3.o: 3.c b.h c.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c clean: -rm main.o 2.o 3.o # -rm 可以排除删除不存在文件导致的错误警告 -f 也可以 按理说 -f更好用 install: myapp @if [ -d $(INSTDIR) ]; then cp myapp $(INSTDIR); chmod a+x $(INSTDIR)/myapp; chmod og-w $(INSTDIR)/myapp; echo "Installed in $(INSTDIR)"; else echo "Sorry, $(INSTDIR) does not exist"; fi
makefile提供了简单的函数库管理方法,可以方便的将生成的.o文件添加到.a库文件之后
1 .c.a: 2 $(CC) -c $(CFLAGS) $< 3 $(AR) $(ARFLAGS) $@ $*.o
make -jN #允许make同时执行N条命令,项目的不同部分可以彼此独立的进行编译时,可以缩短编译时间
gcc -MM main.c xxx.c //gcc编译器将扫描源文件的include语句 然后生成一种可以直接插入到makefile文件的依赖关系