make命令的flag选项如下:
-C DIR 在读取makefile文件之前改变到指定目录中去
-f FILE 以指定FILE文件作为makefile文件
-I 忽略所有的命令错误
-h 显示所有的make选项
-I DIR 当包含其他的makefile文件时,可利用该选项指定搜索目录
-n 只打印要执行的命令,但不执行这些命令
-s 在执行这些命令时不显示命令
-w 在处理makefile文件之前和之后,显示文件目录
-p 显示make变量数据库和隐含规则
makefile 文件的基本结构
1.需要由make命令来创建的项目,通常是目录文件和可执行文件。通常使用“ 目标(target)”一词来表示要创建的项目。
2.要创建的项目依赖于哪些文件
3.创建每个项目时需要运行的命令,命令行的首字母必须为TAB制表符
例如:
#This makefile just is a example
#The following lines indicate how test.o depends
#test.c and test.h,and how to creat teat.o
test.o:test.c test.h
gcc -c -g test.c
makefile文件的变量
makefile有许多便于表达依赖关系以及建立目标的命令特色,其中之一就是变量或宏的变量能力
CC = gcc
CCFLAGS = -D_DEBUG -g -m486
test.o: test.c test.h
$(CC) -c $(CFLAGS)tset.c
GNU make 的主要预定义变量:
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有依赖文件,以空格分开,这些依赖文件的修改日期比目标创建日期晚
$@ 目标的完整名称
$^ 所有依赖文件,以空格分开,不包括重复依赖文件
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
AR 归档维护程序名称,默认值ar
ARFLAGS 归档维护程序选项
AS 汇编程序的名称,默认值as
ASFLAGS 汇编程序的选项
CC C编译器的名称,默认值cc
CCFLAGS C编译器的选项
CPP C预编译器的名称,默认值为$(CC)-E
CPPFLAGS C预编译器的选项
CXX C++编译器的名称,默认值g++
CXXFLAGS C++编译器的选项
我更加倾向于使用模式规则,类似于正则规则,但是前面多了一个%,同时可用来定义目标和依赖文件之间的关系
%.c:%.o
$(CC)$(CCFLAGS)-c -o $@$<
makefile的函数使用时,用一个”$”符号和左括号,函数名,空格后跟一系列又逗号分隔的参数,然后用右括号结束
来看一个例子:
CC = gcc
,函数名,空格后跟一系列又逗号分隔的参数,然后用右括号结束
来看一个例子:
CC = gcc
XX = g++
CFLAGS = -Wall -O –g
TARGET = ./helloworld
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o:%.cpp
$(XX) $(CFLAGS) -c $< -o $@
SOURCES = $(wildcard *.c *.cpp)
OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
$(TARGET) : $(OBJS)
$(XX) $(OBJS) -o $(TARGET)
chmod a+x $(TARGET)
clean:
rm -rf *.o helloworld
函数1:wildcard
产生一个所有以 '.c' 结尾的文件的列表。
SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以 .c,.cpp结尾的文件的列表,然后存入变量 SOURCES 里。
函数2:patsubst
匹配替换,有三个参数。第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的列表。
OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符变成.o,形成一个新的文件列表,然后存入OBJS变量中。
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
这几句命令表示把所有的.c,.cpp编译成.o文件。
这里有三个比较有用的内部变量。$@ 扩展成当前规则的目的文件名, $< 扩展成依靠 列表中的第一个依靠文件,而 $^ 扩展成整个依靠的列表(除掉了里面所有重 复的文件名)。
chmod a+x $(TARGET)表示把helloworld强制变成可执行文件。
XX = g++
CFLAGS = -Wall -O –g
TARGET = ./helloworld
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o:%.cpp
$(XX) $(CFLAGS) -c $< -o $@
SOURCES = $(wildcard *.c *.cpp)
OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
$(TARGET) : $(OBJS)
$(XX) $(OBJS) -o $(TARGET)
chmod a+x $(TARGET)
clean:
rm -rf *.o helloworld
函数1:wildcard
产生一个所有以 '.c' 结尾的文件的列表。
SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以 .c,.cpp结尾的文件的列表,然后存入变量 SOURCES 里。
函数2:patsubst
匹配替换,有三个参数。第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的列表。
OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符变成.o,形成一个新的文件列表,然后存入OBJS变量中。
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
这几句命令表示把所有的.c,.cpp编译成.o文件。
这里有三个比较有用的内部变量。$@ 扩展成当前规则的目的文件名, $< 扩展成依靠 列表中的第一个依靠文件,而 $^ 扩展成整个依靠的列表(除掉了里面所有重 复的文件名)。
chmod a+x $(TARGET)表示把helloworld强制变成可执行文件。
阅读(558) | 评论(0) | 转发(0) |