make命令的选项和参数:
-k:它的作用是让make命令在发现错误时仍然继续执行,而不是在检测到第一个错误时就停下来。
-n:它的作用是让make命令输出将要执行的操作步骤,而不真正执行这些操作
-f :它的作用是告诉make命令将哪个文件作为makefile文件。如果未使用这个选项,标准版本的make
命令将首先在当前目录下查找名为makefile的文件,如果该文件不存在,它就会查找名为Makefile的文件。
但如果你是在linux系统中,你使用的可能是GNU Make,这个版本的make命令将在搜索makefile文件和
Makefile文件之前,首先查找名为GNUmakefile的文件。
1、依赖关系
/*main.c*/
#include "a.h"
/*2.c*/
#include "a.h"
#include "b.h"
/*3.c*/
#include "b.h"
#include "c.h"
则我们可以在makefile中:
myapp: main.o 2.o 3.o
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
这表示的是myapp依赖于main.o、2.o和3.o,而main.o依赖于main.c和a.h,等等
如果想要一次创建多个文件,你可以使用all。
all:myapp myapp.h
如果未指定一个all目标,则make命令将只创建它在文件makefile中找到的第一个目标
2、规则
makefile文件的第二个是规则,它们定义了目标的创建方式。在上节的例字中,当make命令确定
需要重建2.0时,它具体应该使用哪条命令呢?看上去只需使用命令gcc -c 2.c就够了,但是如果
需要指定头文件目录,或者为了今后的调试需要设置符号信息选项又该怎么做呢?这就需要makefile
文件中明确定义一些规则。
一个简单的makefile文件:
myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o: main.c a.h
gcc -c main.c
2.o: 2.c a.h b.h
gcc -c 2.c
3.o: 3.c b.h c.h
gcc -c 3.c
$ make -f Makefile1
makefile文件中的宏:
带宏定义的makefile文件
all: myapp
#which compiler
CC = gcc
#包含文件的位置在哪里
INCLUDE = .
#发展选择
CSLAGS = -g -Wall -ansi
#释放选项
#CFLAGS = -O -Wall -ansi
myapp: main.c 2.o 3.o
$(CC) -o myapp main.o 2.o 3.o
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
内置宏的用法:
宏 定义
$? 当前目标所依赖的文件列表中比当前目标文件还要新的文件
$@ 当前目标的名字
$< 当前依赖文件的名字
$* 不包括后缀名的当前依赖文件的名字
-:告诉make命令忽略所有错误
@:告诉make在执行某条命令前不要将该命令显示在标准输出上
多个目标:
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.c 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
install: myapp
@if [ -d $(INSTDIR) ];
then
ap 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文件的一个片段,它用一个新的通用规则将.cpp文件编译为.o文件;
.SUFFIXES: .cpp
.cpp.o:
(CFLAGS) -I<
用make’管理函数库:
#Local Libraries
MYLIB = mylib.a
myapp: main.o $(MYLIB)
$(CC) -o myapp main.o $(MYLIB)
$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
main.o:main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
clean:
-rm main.o 2.o 3.o $(MYLIB)