makefile01

什么是makefile

Makefile 文件描述了 Linux 系统下 C/C++ 工程的编译规则,它用来自动化编译 C/C++ 项目。一旦写编写好 Makefile 文件,只需要一个 make 命令,整个工程就开始自动编译,不再需要手动执行 GCC 命令。一个中大型 C/C++ 工程的源文件有成百上千个,它们按照功能、模块、类型分别放在不同的目录中,Makefile 文件定义了一系列规则,指明了源文件的编译顺序、依赖关系、是否需要重新编译等。

Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。

make 和 makefile 的关系

make是一个命令工具,它解释Makefile中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。

Cmake 是什么

CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。

CMake能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

Cmake与CMakeLists的关系

cmake是一个命令工具,可用来生成makefile。但也要根据CMakelists.txt中的内容来生成,CMakeLists.txt就是写给cmake的规则她.

注意

make是一个命令工具,Makefile是一个文件,make执行的时候侯,去读取Makefile文件中的规则,重点是makefile得自己写。
cmake是一个命令工具,CMakelists.txt是一个文件,Cmake执行的时候,去读取CMakelists.txt文件中的规则,重点是CMakelists.txt得自自己写。

hello world 开始

Makefile基本语法
目标:依赖
Tab 命令
在这里插入图片描述
在这里插入图片描述
目标:一般是指要编译的目标,也可以是一个动作
依赖:指执行当前目标所要依赖的先项,包括其它目标,某个具体文件或库等
一个目标可以有多个依赖
命令:该目标下要执行的具体命令,可以没有,也可以有多条
多条时,每条命令一行

在这里插入图片描述

在这里插入图片描述
添加依赖:
在这里插入图片描述
在这里插入图片描述
添加多条语句:
在这里插入图片描述
在这里插入图片描述
make clean:
在这里插入图片描述
在这里插入图片描述
添加 @ 执行时不会输出:

clean:@rm -rf a.out

可以自己添加注释输出:

clean:@rm -rf a.out@echo "rm -rf a.out ok"

make常用选项
make [-f file][options][target]
Make默认在当前目录中寻找GUNmakefile,makefile,Makefile的文件作为make的输入文件
-f 可以指定除上述文件名之外的文件作为输入文件
-v 显示版本号
-n 只输出命令,但并不执行,一般用来测试
-s 只执行命令,但不显示具体命令,此处可在命令中用@符抑制命令输出
-w 显示执行前执行后的路径
-Cdir 指定makefile所在的目录
没有指定目标时,默认使用第一个目标
如果指定,则执行对应的命令

编译流程

创建文件
在这里插入图片描述
在这里插入图片描述

make./calculate 

优化
好处:
第一次编译两小时
第二次编译五分钟

# calculate: clean
# 	gcc main.cpp add.cpp mult.cpp div.cpp sub.cpp -o calculate# clean:
# 	rm -rf calculatecalculate:clean add.o sub.o mult.o div.ogcc add.o sub.o mult.o div.o main.cpp -o calculateadd.o:add.cpp gcc -c add.cpp -o add.osub.o:sub.cpp gcc -c sub.cpp -o sub.omult.o:mult.cppgcc -c mult.cpp -o mult.odiv.o:div.cpp gcc -c div.cpp -o div.oclean:rm -rf calculate

gcc main.cpp直接从源代码到目标可执行文件了
把过程拆分
预处理 gcc -E main.cpp>main.ii
编译 gcc -S main.ii得到名为main.s的汇编文件
汇编 gcc -c main.s得到名为main.o(.obj)的二进制文件
链接 gcc main.o得到名为a.out 的可执行文件

在这里插入图片描述

Makefile中的变量

  • 系统变量
    $* 不包括扩展名的目标文件名称
    $< 所有的依赖文件,以空格分隔
    $表示规则中的第一个条件
    $?所有时间戳比目标文件晚的依赖文件,以空格分隔
    $@目标文件的完整名称
    $^ 所有不重复的依赖文件,以空格分隔
    $%如果目标是归档成员,则该变量表示目标的归档成员名称

  • 系统常量(make -p可查看)
    AS 汇编程序的名称,默认为 as
    CC C编译器名称 默认cc
    CPP C预编译器名称 默认cc -E
    CXX C++编译器名称 默认g++
    RM 文件删除程序别名 默认rm-f

show:echo $(AS)echo $(CC)echo $(CPP)echo $(CXX)echo $(RM)

在这里插入图片描述
在这里插入图片描述

  • 自定义变量
    自定义 = 参数
    TARGET = calculate
    使用:
    $(TARGET)

OBJ = add.o sub.o mult.o div.o calc.o 
TARGET = calculate$(TARGET):$(OBJ)gcc $(OBJ) -o $(TARGET)add.o:add.cpp gcc -c add.cpp -o add.osub.o:sub.cpp gcc -c sub.cpp -o sub.omult.o:mult.cppgcc -c mult.cpp -o mult.odiv.o:div.cpp gcc -c div.cpp -o div.ocalc.o:calc.cpp gcc -c calc.cpp -o calc.oclean:rm -rf calculate *.o

变量替换


OBJ = add.o sub.o mult.o div.o calc.o 
TARGET = calculate$(TARGET):$(OBJ)$(CXX) $^ -o $@add.o:add.cpp $(CXX) -c $^ -o $@sub.o:sub.cpp $(CXX) -c $^ -o $@mult.o:mult.cpp$(CXX) -c $^ -o $@div.o:div.cpp $(CXX) -c $^ -o $@calc.o:calc.cpp $(CXX) -c $^ -o $@clean:$(RM) $(TARGET) *.oshow:echo $(AS)echo $(CC)echo $(CPP)echo $(CXX)echo $(RM)

在这里插入图片描述

伪目标和模式匹配

伪目标.PHONY:clean
声明目标为伪目标之后,mokefile将不会判断目标是否存在或该目标是否需要更新

执行make clean 会删除文件
这时在当前目录下创建一个名为clean的文件
再次执行make clean 提示
make: ‘clean’ is up to date.
在这里插入图片描述
解决方法
添加为伪目标

.PHONY:clean 

在这里插入图片描述

按照OBJ顺序来的

在这里插入图片描述
%.0:%.cpp .0依赖于对应的.cpp
wildcard $(wildcard ./*.cpp)获取当前目录下所有的.cpp文件
patsubst $(patsubst %.cpp,%.o,/*cpp)将对应的cpp文件名替换成.0文件名
在这里插入图片描述
使用

# OBJ = add.o sub.o mult.o div.o calc.o 
OBJ = $(patsubst %.cpp,%.o,$(wildcard ./*.cpp))

在这里插入图片描述

报错

在这里插入图片描述
问题
make: show: No such file or directory
make: *** [Makefile:37: show] Error 127
解决
使用echo

运行流程

保证目标是用最新的依赖生成的
第一次全完编译,后面只编译最新的代码(部份编译)
在这里插入图片描述

在这里插入图片描述

学习参考

https://www.bilibili.com/video/BV1Xt4y1h7rH/?p=5&spm_id_from=pageDriver&vd_source=e70917aa6392827d1ccc8d85e19e8375

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/589588.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity类银河恶魔城学习记录12-2 p124 Character Stats UI源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_Statslot.cs using System.Collections; using System.Collections.Gen…

云计算的安全需求

目录 一、概述 二、云安全服务基本能力要求 三、信息安全服务&#xff08;云计算安全类&#xff09;资质要求 3.1 概述 3.2 资质要求内容 3.2.1 组织与管理要求 3.2.2 技术能力要求 四、云安全主要合规要求 4.1 安全管理机构部门的建立 4.2 安全管理规范计划的编制 4…

回溯算法|78.子集

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集&#xff0c;要放在终止添加的上面&#xff0c;否则会漏掉自…

linux 回收站机制(笔记)

Linux下回收站机制https://mp.weixin.qq.com/s/H5Y8VRcaOhFZFXzR8yQ7yg 功能 &#xff1a;设立回收站&#xff0c;并且可定时清空回收站。 一、建议将alias rm 改成别的。 比如alias rmm &#xff0c;同时修改rm -rf ~/.trash/* 改成 rmm -rf ~/.trash/* 不然影响rm 的正常使…

Axure案例分享—垂直手风琴(附下载地址)

今天分享的案例是Axure8(兼容9和10)制作的垂直手风琴 一、功能介绍 折叠或展开多个面板内容&#xff0c;默认为展开一项内容&#xff0c;点击任一收起的选项&#xff0c;展开面板&#xff0c;其他面板收起二、制作过程 原型是由矩形组件以及动态面板构成&#xff0c; 拖入一…

黑马点评项目笔记 I

短信登录 将逻辑过期时间写入redis里面 Slf4j RestController RequestMapping("/user") public class UserController {Resourceprivate IUserService userService;Resourceprivate IUserInfoService userInfoService;/*** 发送手机验证码*/PostMapping("code&…

HarmonyOS 应用开发之非线性容器

非线性容器实现能快速查找的数据结构&#xff0c;其底层通过hash或者红黑树实现&#xff0c;包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种。非线性容器中的key及value的类型均满足ECMA标准。 HashMap HashMap 可用来存储具有关联…

TSINGSEE青犀推出河道/河湖/水域治理视频AI智能解决方案

一、方案背景 “十四五”时期&#xff0c;在面源污染防治等方面实现突破&#xff0c;实现主要水污染排放总量持续减少&#xff0c;水生态环境持续改善等任务艰巨。进一步完善流域综合治理体系&#xff0c;提升流域水环境综合治理能力和水平&#xff0c;更好适应新阶段发展需求…

电商数据API接口|抓取京东淘宝1688商品数据颜色sku信息

公共参数 API请求测试地址 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes…

蓝桥杯备考

目录 P8823 [传智杯 #3 初赛] 期末考试成绩 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码 P8828 [传智杯 #3 练习赛] 直角三角形 题目描述 输入格式 输出格式 输入输出样例 代码 P8833 [传智杯 #3 决赛] 课程 题目背景 题目描述 输入格式 输出格式…

Springboot传参要求

传参的参数名称必须与Set方法的参数名字相同 &#xff0c;不然会报错。

阿里云数据库服务器价格表查询,一键查询报价

阿里云数据库服务器价格表&#xff0c;优惠99元一年起&#xff0c;ECS云服务器2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;优惠价格99元一年&#xff1b;阿里云数据库MySQL版2核2G基础系列经济版99元1年、2核4GB 227.99元1年&#xff0c;云数据库PostgreSQL、SQL Serve…