快速上手Makefile

作者: Leon_Geo | 来源:发表于2019-02-08 08:37 被阅读5次

    一、What

    Makefile是一个规定了怎么去编译和链接程序的脚本文件,在执行make命令时会执行该文件,window环境下的IDE,如visual studio已经集成了该功能,不需要关心程序的编译规则,在linux下做C/C++开发时经常用到,说到这里首先要知道一个工具make。
    make是一个解释Makefile中指令的命令工具,常见的IDE都集成了这个工具。目前centos 7.3 GNU的make版本是3.82。

    二、Ruler

    目标文件:依赖文件列表(逗号分隔)
    [Tab]系统指令 (注意:系统指令前必须有tab)

    三、USE

    3.1 Simple uer

    现有文件main.cpp test.cpp test.h三个文件,Makefile实现增量编译(当其中有一个文件变化时,重新编译该文件)

    helloworld: main.o test.o
        g++ main.o test.o -o helloworld
    
    main.o: main.cpp test.h
        g++ -c main.cpp -o main.o
    
    test.o: test.cpp test.h
        g++ -c test.cpp -o test.o
    
    clean:
        rm *.o helloworld
    

    3.2 Complex uer

    注释:
    行前面加"#"号,如#g++ main.o test.o -o helloworld 表示注释了该行

    变量:
    用=定义一个变量,并且赋值(等号两边可以加空格)
    用+=追加字符串
    用$(A)来取得变量的值

    例:

    A = src
        echo $(A)  
        @echo $(A)  ##只输出echo的结果,不显示执行的命令
    

    特殊变量:

    $@ 目标文件
    $^ 依赖项列表
    $< 依赖项列表第一项
    

    函数:
    Makefile中有一些预定义函数,形式:
    $(函数名 参数列表)
    参数列表:以逗号分隔
    函数名和参数之间用空格分开

    #获取当前目录路径
    PWD = $(shell pwd)
    
    #获取当前目录下所有.cpp文件
    CXX_SOURCES = $(wildcard *.cpp)
    
    #获取当前目录下所有.cpp文件编译后的所有目标文件.o
    CXX_OBJECTS = $(patsubst *.cpp *.o, $(CXX_SOURCES))
    

    3.3 Optmized use

    EXE = helloworld
    GCC = g++
    
    $(EXE): main.o test.o
            $(GCC) $^ -o $(EXE)
    
    
    main.o: main.cpp test.h
            $(GCC) -c $< -o $@
    
    
    test.o: test.cpp test.h
            $(GCC) -c $< -o $@
    
    clean:
            rm *.o $(EXE)
    

    3.4 More Optmized Uer

    继续优化Makefile,添加文件夹,把源码都放入src和lib文件夹,保持增量编译,即为Makefile通用模板

    EXE = helloworld
    GCC = g++
    SUBDIR = src lib
    
    CPP_SOURCES = $(foreach dir, $(SUBDIR), $(wildcard $(dir)/*.cpp))
    CPP_OBJECTS = $(patsubst %.cpp, %.o, $(CPP_SOURCES))
    DEP_FILES = $(patsubst %.o, %.d, $(CPP_OBJECTS))
    $(EXE): $(CPP_OBJECTS)
            $(GCC) $(CPP_OBJECTS) -o $@
    %.o: %.cpp
            $(GCC) -c -MMD $< -o $@
    -include $(DEP_FILES)
    clean:
            rm  $(CPP_OBJECTS)  $(EXE)
    

    相关文章

      网友评论

        本文标题:快速上手Makefile

        本文链接:https://www.haomeiwen.com/subject/dvunsqtx.html