C++关于Makefile的详解含通用模板

 更新时间:2018年12月22日 09:23:47   作者:蜗牛201  
今天小编就为大家分享一篇关于C++关于Makefile的详解含通用模板,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

介绍

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

make是一个解释Makefile中指令的命令工具,常见的IDE都集成了这个工具。目前centos 7.3 GNU的make版本是3.82

规则

目标文件:依赖文件

[Tab]系统指令1     (注意:系统指令前必须有tab)

使用

3.1 简单使用

现有文件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 makefile中使用注释,变量和函数

注释:

    行前面加"#"号,如#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 优化3.1中Makefile

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 优化3.3中Makefile

继续优化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可以作为通用Makefile模板来编译C/C++项目,欢迎收藏

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • C++计算图任意两点间的所有路径

    C++计算图任意两点间的所有路径

    这篇文章主要为大家详细介绍了C++求图任意两点间的所有路径 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Qt使用QPainter绘制3D立方体

    Qt使用QPainter绘制3D立方体

    这篇文章主要为大家详细介绍了Qt使用QPainter绘制3D立方体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C++实现LeetCode(82.移除有序链表中的重复项之二)

    C++实现LeetCode(82.移除有序链表中的重复项之二)

    这篇文章主要介绍了C++实现LeetCode(82.移除有序链表中的重复项之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++关于size_t的bug解决案例

    C++关于size_t的bug解决案例

    这篇文章主要为大家介绍了C++关于size_t的bug解决案例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • C语言 语义陷阱超详细梳理总结

    C语言 语义陷阱超详细梳理总结

    这篇文章主要介绍了C语言常见的一些语义陷阱,梳理的比较全面,对我们做开发的过程中有一定帮助,感兴趣的朋友快来看看吧
    2022-03-03
  • 深入理解C语言的new[]和delete[]

    深入理解C语言的new[]和delete[]

    new和delete既是C++中的关键字也是一种特殊的运算符。这篇文章主要介绍了C++的new和delete详解,需要的朋友可以参考下
    2021-09-09
  • 一篇文章带你了解C++特殊类的设计

    一篇文章带你了解C++特殊类的设计

    这篇文章主要为大家详细介绍了C++特殊类的设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言 分支语句详解分析

    C语言 分支语句详解分析

    分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句
    2021-10-10
  • C++数据结构之AVL树的实现

    C++数据结构之AVL树的实现

    AVL树是高度平衡的而二叉树,它的特点是AVL树中任何节点的两个子树的高度最大差别为1,本文主要给大家介绍了C++如何实现AVL树,需要的朋友可以参考下
    2022-06-06
  • C++编程使用findfirst和findnext查找及遍历文件实现示例

    C++编程使用findfirst和findnext查找及遍历文件实现示例

    这篇文章主要为大家介绍了C++编程如何使用findfirst和findnext查找及遍历文件实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10

最新评论