8)objects = *.o
通配符同样可以用在变量中。并不是说[*.o]会展开,objects的值就是“*.o”。Makefile 中的变量其实就是 C/C++中的宏。如果你要让通配符在变量中展开,也就是让 objects 的值是所有[.o]的文件名的集合,那么,你可以这样:objects := $(wildcard *.o),这种用法由关键字“wildcard”指出。
9)通过makefile编译,自动推导,如果发现当前的文件没有做过更新,则不会编译,只编译更新过了的。
附:
1、预定义变量选项
预定义变量 |
含义 |
$* |
不包含扩展名的目标文件名称。 |
$+ |
所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。 |
$< |
第一个依赖文件的名称。 |
$? |
所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。 |
$@ |
目标的完整名称。 |
$^ |
所有的依赖文件,以空格分开,不包含重复的依赖文件。 |
$% |
如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。 |
AR |
归档维护程序的名称,默认值为 ar。 |
ARFLAGS |
归档维护程序的选项。 |
AS |
汇编程序的名称,默认值为 as。 |
ASFLAGS |
汇编程序的选项。 |
CC |
C 编译器的名称,默认值为 cc。 |
CCFLAGS |
C 编译器的选项。 |
CPP |
C 预编译器的名称,默认值为 $(CC) -E。 |
CPPFLAGS |
C 预编译的选项。 |
CXX |
C++ 编译器的名称,默认值为 g++。 |
CXXFLAGS |
C++ 编译器的选项。 |
2、make 选项
命令行选项 |
含义 |
-C DIR |
在读取 makefile 之前改变到指定的目录 DIR。 |
-f FILE |
以指定的 FILE 文件作为 makefile。 |
-h |
显示所有的 make 选项。 |
-i |
忽略所有的命令执行错误。 |
-I DIR |
当包含其他 makefile 文件时,可利用该选项指定搜索目录。 |
-n |
只打印要执行的命令,但不执行这些命令。 |
-p |
显示 make 变量数据库和隐含规则。 |
-s |
在执行命令时不显示命令。 |
-w |
在处理 makefile 之前和之后,显示工作目录。 |
-W FILE |
假定文件 FILE 已经被修改。 |
3、示例代码
CC=gcc
CXX=g++
CFLAGS= -g -Wall
INC=./***
LIB=./***.a
CFLAGS+= -DSNACC_DEEP_COPY -DHAVE_VARIABLE_SIZED_AUTOMATIC_ARRAYS -Wno-deprecated -lpthread -lssl
TARGET=***
OBJ = **.o \
./**.o\
$(TARGET): $(OBJ)
$(CXX) $(CFLAGS) -o $@ $^ $(LIB)
#如下代码,把所有的cpp文件编译成.o文件
%.o: %.cpp
$(CXX) $(CFLAGS) $(INC) -c -o $@ $<
clean:
rm -f *.o
rm -f $(TARGET)
参考
【1】 http://www.cnblogs.com/goodcandle/archive/2005/11/17/278702.html