make学习,参考「Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码」

程序见:https://github.com/ShiqiYu/CPP/tree/main/week03/examples/lab

文件结构

make语法

  • g++
#「只编译不链接」编译.cpp文件,得到.o文件
g++ -c *.cpp #链接,将.o文件链接到一起,得到可执行文件
g++ *.o file # 显示编译时的warning
g++ -c -Wall *.cpp

版本1

## VERSION 1
hello: main.cpp printhello.cpp factorial.cpp
g++ -o hello main.cpp printhello.cpp factorial.cpp
  • 目标(hello)依赖于后面的.cpp文件(main.cpp printhello.cpp factorial.cpp)
  • 通过第二句生成这个目标(hello)

版本2

## VERSION 2
# 变量定义
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o # 「链接」.o文件
$(TARGET): $(OBJ)
$(CXX) -o $(TARGET) $(OBJ) # 「编译」生成.o
main.o: main.cpp
$(CXX) -c main.cpp printhello.o: printhello.cpp
$(CXX) -c printhello.cpp factorial.o: factorial.cpp
$(CXX) -c factorial.cpp

版本3

## VERSION 3
# 变量定义
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o # 编译时显示warning
CXXFLAGS = -c -Wall $(TARGET): $(OBJ)
$(CXX) -o $@ $^ %.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@ .PHONY: clean
clean:
rm -f *.o $(TARGET)
  • ($@)表示($(TARGET))
  • ($^)表示($(TARGET))的所有依赖,即($(OBJ))
  • ($<)表示($(TARGET))的第一个依赖,即(%.cpp)
  • 通配符\(\%\)表示匹配所有类型的文件
  • (.PHONY: clean)解决项目中出现clean文件而make clean失效的问题,因为项目中永远没有(.PHONY),所有不会失效,而(.PHONY)依赖于clean,所以make clean必执行

版本4

## VERSION 4
CXX = g++
TARGET = hello
SRC = $(wildcard *.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SRC)) CXXFLAGS = -c -Wall $(TARGET): $(OBJ)
$(CXX) -o $@ $^ %.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@ .PHONY: clean
clean:
rm -f *.o $(TARGET)
  • 将当前目录下的所有(*.cpp)文件都放在(SRC)变量里

    • 「wildcard」是一个扩展通配符,常用使用:$(wildcard PATTERN...),在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表
    • 这里的$(wildcard *.cpp)表示获取工作目录下的所有.cpp文件列表
  • 将(SRC)目录下的所有.cpp文件替换成.o文件
    • 「patsubst」也是一个扩展通配符,语法:$(patsubst %.c,%.o,$(wildcard *.c)),表示替换
  • 更多参考:https://blog.csdn.net/m0_46535940/article/details/125086502

参考

1、http://www.freecplus.net/b7a1c199959f4349b2a98874864a2000.html

make学习的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  10. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

随机推荐

  1. 关于MNN工程框架编译出来的静态库和动态库的使用

    一.MNN.lib文件路径 如果你看过之前的博客内容,应该可以在编译的的工程当中 C:\Users\Administrator\Desktop\MNN\MNN-master\MNN-CPU-OPENC ...

  2. Bulk-Crap-Uninstaller:一个高效卸载,轻松管理你的应用程序的.Net开源工具

    我们在工作中,经常需要安装大量的软件,随着应用程序的不断增多,管理这些软件变得非常困难. 下面介绍一款具备高效.简洁的特点,可以帮助我们快速卸载大量不需要的应用程序,让电脑管理变得更加轻松. 01 项 ...

  3. springboot~jpa优雅的处理isDelete的默认值

    如果多个实体类都有 isDelete 字段,并且你希望在插入时为它们统一设置默认值,可以采取以下几种方法来减少代码重复: 1. 使用基类(抽象类) 创建一个基类,其中包含 isDelete 字段和 @ ...

  4. Navicat Premium 16下载与安装

    1.可以通过以下两种方式下载 a.官网下载地址 https://www.navicat.com.cn/download/navicat-premium b.百度网盘下载地址 链接:https://pa ...

  5. 不错的PHP扩展

    不错的PHP扩展 ext name ext description ds data structure 提供list hash queue等数据结构 igbinary 数据压缩(速度快 压缩后内容小) ...

  6. APISIX配置

    APISIX yum install -y apisix-2.12.1-0.el7.x86_64.rpm yum install -y cyrus-sasl-devel-2.1.26-23.el7.x ...

  7. Go获取文件路径,文件名,后缀

    import ( "fmt" "os" "path/filepath" "path" ) files := " ...

  8. Memcached笔记——(一)安装&常规错误&监控

    08年的时候接触过Memcached,当时还对它的客户端产品嗤之以鼻,毕竟手工代码没有各种ORM原生XML配置方便.尽管如此,Memcached现在已经成了服务器架构里不可或缺的一部分! 相关链接:  ...

  9. Ansible 运维自动化

    Ansible 概述Ansbile是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,列如持续部署,滚动更新.Ansible 适用于管理企业IT基础设施,从具有少数主机的小规模到数 ...

  10. 服务器安全之DenyHosts

    情景:今天登录服务器,突然发现登录之后展示的信息有点多,仔细端倪发现: There were 3975 failed login attempts since the last successful ...