Makefile简单编写实例

介绍一下Makefile的简单编写例子。函数

编写Makefile的规则就是:code

目标文件:依赖文件
(tab)编译规则

如今我有一个文件目录结构为:blog

解释一下这几个文件。首先我建立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中我调用了它们:file

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

以上,咱们遵循咱们的规则:gc

目标文件:依赖文件
(tab)编译规则

首先,main是咱们最后要生成的可执行文件,它依赖于全部的.o文件,编译规则就是直接g++ -o .o文件便可。im

而后,咱们的.o文件呢,又依赖于.c文件,因此下面也要写。其中要注意,头文件在上层目录的include下,因此要加上:makefile

-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变量的值。
  • $@ 目标文件
  • $^ 所有依赖
  • $< 第一个依赖
  • $? 第一个变化的依赖
相关文章
相关标签/搜索