make学习
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文件列表
- 「wildcard」是一个扩展通配符,常用使用:
- 将(SRC)目录下的所有.cpp文件替换成.o文件
- 「patsubst」也是一个扩展通配符,语法:
$(patsubst %.c,%.o,$(wildcard *.c)),表示替换
- 「patsubst」也是一个扩展通配符,语法:
- 更多参考:https://blog.csdn.net/m0_46535940/article/details/125086502
参考
1、http://www.freecplus.net/b7a1c199959f4349b2a98874864a2000.html
make学习的更多相关文章
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
随机推荐
- Air780E软件指南:UDP应用示例
一.UDP概述 UDP(用户数据报协议,UserDatagramProtocol)是一种无连接的.不可靠的传输层协议,主要用于实现网络中的快速通讯.以下是UDP通讯的主要特点: 1.1 无连接通讯: ...
- pnpm 是如何颠覆 npm 和 yarn 的?
今天研究了一下 pnpm 的机制,发现它确实很强大,甚至可以说对 yarn 和 npm 形成了降维打击 . 我们从包管理工具的发展历史,一起看下到底好在哪里? npm2 在 npm 3.0 版本之前, ...
- php调试工具之firePHP
让PHP可以像js一样利用浏览器的控制台调试代码 ------- FirePHP(http://www.firephp.org/) 1. 安装FirePHP插件 在Chrome浏览器的应用商店中,搜 ...
- 解决GitHub无法访问问题
作为开发者,经常使用借助GitHub进行开发,但是最近一直无法访问github.com站点,决定搞一下!!! 由于国内某些原因,导致我们有时候不能访问到 www.github.com.此时我们必须找到 ...
- VUE3 使用资源路径加载
1.使用场景 有些情况下,我需要使用组件路径动态的方式加载组件. 2.实现方法 import { defineAsyncComponent } from 'vue'; /** * 根据view组件路径 ...
- 实用&free的音频格式转化工具
最近写的博客居然是7年前,今天给小朋友下载歌曲时在网上搜了好多格式转化的方法,挨个尝试了之后发现好多是收费的,或者不支持某种格式转化的,但还是大浪淘沙到一些实用的工具.分享给大家参考,同时也督促自己不 ...
- Vue.js 文本行滚动
1.前言 文本行滚动组件,效果如图 2.封装思路 封装一个组件,接收一个数组,每个数组元素就是一个段文本 组件使用httpVueLoader进行封装加载 使用css位移,配合过渡效果才展示动画 滚动逻 ...
- 【kernel】从 /proc/sys/net/ipv4/ip_forward 参数看如何玩转 procfs 内核参数
本文的开篇,我们先从 sysctl 这个命令开始. sysctl 使用 sysctl 是一个 Linux 系统工具,后台实际上是 syscall,它允许用户查看和动态修改内核参数. # 查看当前设置的 ...
- 对象存储 COS 推出一站式内容审核服务,助力打造绿色互联网
今年,国家网信办深入推进"清朗·春节网络环境"专项行动.截至3月24日,网信办共累计清理相关违法违规信息208万余条,处置账号7.2万余个,协调关闭.取消备案网站平台2300余家. ...
- 【前端】【H5 API】Web存储 Web Storage
Web存储 传统的方式是使用document.cookie来进行存储,但是由于其存储空间有限(大约4KB),并且需要复杂的操作来解析,给开发者带来了诸多不便. 为此,HTML 5规范提出了网络存储的相 ...