zoukankan      html  css  js  c++  java
  • 快速上手Makefile

    一、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)
    
  • 相关阅读:
    7,C++ public, protected, private 继承的区别
    6,又一道经典的微软题
    5,一道经典的微软程序题
    33. Search in Rotated Sorted Array
    198,House Robber
    4,二维数组中指针的问题
    剑指offer——stack与queue的互相实现
    3,C语言文件读写
    2,虚函数
    剑指offer——已知二叉树的先序和中序排列,重构二叉树
  • 原文地址:https://www.cnblogs.com/leon1124/p/14039811.html
Copyright © 2011-2022 走看看