Makefile的构建hello
可执行文件,如果中的任何一个main.cpp
,hello.cpp
,factorial.cpp
改变。实现该规范的最小可能的Makefile可能是:
hello: main.cpp hello.cpp factorial.cpp
g++ -o hello main.cpp hello.cpp factorial.cpp
- 亲:很容易读
- 缺点:维护的噩梦,C ++依赖项的重复
- 缺点:效率问题,即使只更改了一个,我们也重新编译了所有C ++
为了改进上述内容,我们仅编译那些已编辑的C ++文件。然后,我们只将结果对象文件链接在一起。
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
main.o: main.cpp
g++ -c main.cpp
hello.o: hello.cpp
g++ -c hello.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
- 专家:修复效率问题
- 缺点:新的维护噩梦,目标文件规则可能出现错字
为了对此进行改进,我们可以将所有目标文件规则替换为一个.cpp.o
规则:
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
.cpp.o:
g++ -c $< -o $@
这里的.cpp.o
规则定义如何建立anyfile.o
从anyfile.cpp
。
$<
匹配第一个依赖项,在这种情况下, anyfile.cpp
$@
匹配目标,在这种情况下为anyfile.o
。
Makefile中存在的其他更改是:
- 使将编译器从g ++更改为任何C ++编译器变得更加容易。
- 使更改编译器选项更加容易。
- 使更改链接器选项更加容易。
- 使更改C ++源文件和输出变得更加容易。
- 添加了默认规则“全部”,该规则可以快速检查以确保在尝试构建应用程序之前所有源文件都存在。