zoukankan      html  css  js  c++  java
  • 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
    ", add(10, 3));
    	printf("mul = %d
    ", mul(10, 3));
    	printf("sub = %d
    ", sub(10, 3));
    	printf("div = %lf
    ", 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变量的值。
    • $@ 目标文件
    • $^ 全部依赖
    • $< 第一个依赖
    • $? 第一个变化的依赖
  • 相关阅读:
    2020年封装APP之详解
    Linux 强制卸载硬盘 (Device is busy)
    pacman 非交互状态使用
    Snakemake 修改默认工作目录
    LaTeX 表格排版中遇到 Misplaced oalign
    重启崩溃的 KDE
    python robot.libraries.BuiltIn import BuiltIn库
    logging 常用配置
    paramiko 获取远程服务器文件
    物理时间使用Python脚本转格林卫时间
  • 原文地址:https://www.cnblogs.com/love-jelly-pig/p/10040578.html
Copyright © 2011-2022 走看看