test:a.o #test是生成的目标,a.o是用于生成的文件
g++ -o test a.o #编译器 -o 目标文件 来源文件
a.o:a.cpp #a.o是结果,a.cpp是来源
#-c表示只编译不链接,生成.o文件
g++ -o a.o -c a.cpp #编译器 -o 目标文件 -c 来源文件
-o 目标文件 和 来源文件 顺序没有要求
编译器 -o 目标文件 中间文件 库目录(CCFLAGS) 库文件(LIBS)
编译器 -o 中间文件 -c cpp文件 包含目录(LDFLAGS)
$@ 目标的文件名
$< 第一个条件的文件名
$? 时间戳在目标之后的所有条件, 并以空格隔开这些条件
$^ 所有条件的文件名, 并以空格隔开, 且排除了重复的条件
$+ 与$^类似, 只是没有排除重复的条件
$* 目标的主文件名, 不包含扩展名
实例
libinterface.so:$(obj)
g++ -shared -fPIC -o ./bin/libinterface.so $(obj) $(LDFLAGS) $(LIBS)
./obj/%.o:./src/%.cpp
g++ -o $@ -c $< $(CCFLAGS)