Makefile简单编写实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Makefile简单编写实例
介绍⼀下Makefile的简单编写例⼦。
编写Makefile的规则就是:
⽬标⽂件:依赖⽂件
(tab)编译规则
现在我有⼀个⽂件⽬录结构为:
解释⼀下这⼏个⽂件。
⾸先我创建makefile⽬录,底下有⼀个include⽬录和src⽬录。
include⽬录存放⼀个head.h头⽂件,是我们src中所有cpp⽂件都要引⽤的头⽂件。
这四个cpp⽂件就是实现加减乘除的功能。
把add.cpp看⼀下就知道了:
#include "head.h"
int add(int a, int b)
{
return a + b;
}
其余都⼀样,做各⾃的运算⽽已。
⽽main.cpp中我调⽤了它们:
int main(int argc, char const *argv[])
{
printf("sum = %d\n", add(10, 3));
printf("mul = %d\n", mul(10, 3));
printf("sub = %d\n", sub(10, 3));
printf("div = %lf\n", div(10, 3));
return 0;
}
直接编写,易于理解
现在我们要实现的功能就很明了了,编译这⼏个cpp,⽣成⼀个可执⾏⽂件,使得我们能够正确运⾏结果。
这⾥⾯我写了两个Makefile⽂件,第⼀个是Makefile_SB(改名之后),这个⽤来理解makefile的编写规则很有⽤:
main:main.o add.o mul.o sub.o div.o
g++ -o main add.o mul.o sub.o div.o main.o
main.o:main.cpp
g++ -c -I ../include main.cpp
add.o:add.cpp ../include/head.h
g++ -c -I ../include add.cpp
mul.o:mul.cpp ../include/head.h
g++ -c -I ../include mul.cpp
sub.o:sub.cpp ../include/head.h
g++ -c -I ../include sub.cpp
div.o:div.cpp ../include/head.h
g++ -c -I ../include div.cpp
.PHONY:clean
clean:
rm -f *.o
以上,我们遵循我们的规则:
⽬标⽂件:依赖⽂件
(tab)编译规则
⾸先,main是我们最后要⽣成的可执⾏⽂件,它依赖于所有的.o⽂件,编译规则就是直接g++ -o .o⽂件即可。
然后,我们的.o⽂件呢,⼜依赖于.c⽂件,所以下⾯也要写。
其中要注意,头⽂件在上层⽬录的include下,所以要加上:
-I ../include
⾄于.PHONY,是⼀个伪⽬标,我们真正的⽬标都是会⽣成的,⽽clean只是我们清除⽂件使⽤的,它并不⽣成⼀个⽬标⽂件,所以我们使⽤伪⽬标来执⾏这个命令。
简洁编写,使⽤函数
在我⽬录下的Makefile⽂件,才是我最后使⽤的那个⽂件:
#获取.cpp⽂件
SrcFiles=$(wildcard *.cpp)
#使⽤替换函数获取.o⽂件
ObjFiles=$(patsubst %.cpp,%.o,$(SrcFiles))
#⽣成的可执⾏⽂件
all:main
#⽬标⽂件依赖于.o⽂件
main:$(ObjFiles)
g++ -o $@ -I ../include $(SrcFiles)
#.o⽂件依赖于.cpp⽂件,通配使⽤,⼀条就够
%.o:%.cpp
g++ -c -I ../include $<
.PHONY:clean all
clean:
rm -f *.o
rm -f main
有了我们上⾯的规则讲解之后,这个就能很好的理解。
先介绍两个函数:wildcard函数,就是获取指定的⽂件
patsubst函数,有替换功能。
⽽SrcFiles和ObjFiles都是变量,它不⽤特别的定义,直接写出来就是定义了。
再写⼀下其它符号的意义,记住就⾏了:
$(Files),取File变量的值。
$@ ⽬标⽂件
$^ 全部依赖
$< 第⼀个依赖
$? 第⼀个变化的依赖。