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】
【2】
【3】
【4】