Makefile总结

这是学习Makefile的总结

目标

Makefile的目标名称不是随便取的:

1
2
3
4
5
6
exe:main.o
    g++ main.o -std=c++11
main.o:defs.h
.PHONY:clean
clean:
    -rm *.o exe

这里如果你第二个目标不是main.o的话,那么后面是没有办法自动推导出main.cppg++ -c main.cpp这种的。

make总是执行第一个目标,然后根据依赖来执行其他目标。

伪目标

伪目标跟在.PHONY后面,用于执行一些指令:

1
2
3
.PHONY:clean
clean: 
    -rm *.o exe

.PHONY后面也可以是多个伪目标,伪目标也可以有依赖项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
main:main.o
    g++ main.o -o main -std=c++11
exe:exe.o
    g++ exe.o -o exe -std=c++11
main.o:
exe.o:
.PHONY:clean all
clean:
    -rm *.o exe
all:main exe

这样执行make all的话会制动执行main和exe目标

变量

变量用=声明,用:=附加数据,用${}使用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
OBJ=main.o
OBJ:=exe.o #现在是main.o exe.o
SRC=main exe
main:main.o
    g++ main.o -o main -std=c++11
exe:exe.o
    g++ exe.o -o exe -std=c++11
main.o:
exe.o:
.PHONY:clean all
clean:
    -rm *.o exe
all:${SRC}

变量会在指定的地方准确的展开。

带第三方库的编译

一般我们可以这样写:

1
2
3
4
5
main:main.cpp
    g++ main.cpp -o main `wx-config --libs --cflags` -std=c++11
.PHONY:clean
clean:
    -rm main

这是没有办法写成自动推导的,最多写成这样:

1
2
3
4
5
6
7
drawShape:drawShape.o 
    g++ drawShape.o -o drawShape `wx-config --libs` -std=c++11
drawShape.o:
    g++ drawShape.cpp -c `wx-config --cflags` -std=c++11
.PHONY:clean
clean:
    -rm drawShape *.o

这里我们必须通过直接写出编译指令来找到头文件。所以这里就不能用自动推导了。

updatedupdated2023-06-182023-06-18