makefile语法解析

news2024/12/25 0:57:05

gcc语法简介

gcc (-c) hello.c world.c -o main

-c表示只编译不链接
-o目标文件

此外,还有-I(大写的I)表示给gcc添加自定义的头文件的路径
-L表示给gcc添加额外的搜索库的路径
-g选项的意义是“生成调试信息,该程序可以被调试器调试”

这个时候发现的问题是如果有很多的源码以及库文件,在编译的时候需要执行很长的命令。因此,引入了make工具

构建项目

新建,项目文件夹hello,及文件main.cpp,factorial.cpp,printhello.cpp,functions.h。

hello目录的结构如下:

hello/
├──main.cpp
├──factorial.cpp
├──printhello.cpp
└──functions.h

main.cpp

#define _FUNCTIONS_H_

#include <iostream>
#include "functions.h"
using namespace std;

int main()
{
	printhello();
	
	cout << "This is main:" << endl;
	cout << "The factorial of 5 is:" << factorial(5) << endl;
	return 0;
}

factorial.cpp

#include "functions.h"

int factorial(int n)
{
	if (n==1)
		return 1;
	else
		return n * factorial(n-1);
}

printhello.cpp

#include <iostream>
#include "functions.h"
using namespace std;

void printhello()
{
	int i;
	cout << "Hello World!" << endl;
}

functions.h

#ifdef _FUNCTIONS_H_
#define _FUNCTIONS_H_
void printhello();
int factorial(int n);
#endif

使用g++命令直接编译、运行

g++ main.cpp factorial.cpp printhello.cpp -o main
./main

使用makefile

version1

hello: main.cpp printhello.cpp factorial.cpp
	g++ -o hello main.cpp printhello.cpp factorial.cpp

其中,冒号前的hello是目标,:main.cpp printhello.cpp factorial.cpp后的是依赖。表示hello目标的生成需要依赖于main.cpp printhello.cpp factorial.cpp。hello通过 g++ -o hello main.cpp printhello.cpp factorial.cpp这条命令来生成。

执行make的时候会去在当前目录下找hello,如果没有的话,会通过命令g++ -o hello main.cpp printhello.cpp factorial.cpp去生成。
再次make如果提醒make: ‘hello’ is up to date。是因为ll可以看到hello比main.cpp printhello.cpp factorial.cpp这几个文件要新。如果main.cpp printhello.cpp factorial.cpp任何文件有改动,再执行make的话会去重新生成hello文件。
在这里插入图片描述

Version 2

CXX = g++
TARGET = hello 
OBJ = main.o printhello.o factorial.o

$(TARGET): $(OBJ)
	$(CXX) -o $(TARGET) $(OBJ)

main.o: main.cpp
	$(CXX) -c main.cpp

printhello.o: printhello.cpp
	$(CXX) -c printhello.cpp

factorial.o: factorial.cpp
	$(CXX) -c factorial.cpp

在这里插入图片描述
依次去找TARGET发现没有,去找OBJ发现没有。然后去找main.o、printhello.o、factorial.o,执行对应的命令,最后执行 $(CXX) -o $(TARGET) $(OBJ)

修改其中一个依赖文件。eg.main.cpp使得此时main.cpp最新。
在这里插入图片描述
此时只会重新编译main.cpp:
在这里插入图片描述

Version 3

CXX = g++
TARGET = hello 
OBJ = main.o printhello.o factorial.o

CXXFLAGS = -c -Wall

$(TARGET): $(OBJ)
	$(CXX) -o $@ $^

%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

.PHONY: clean
clean:
	rm -f *.o $(TARGET)

$@ 表示目标,$^表示所有依赖文件。$<表示第一个依赖文件。
打印warnig因为加入了CXXFLAGS = -c -Wall
在这里插入图片描述

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)

指定文件名

make -f makerules.mk

默认的文件名是Makefile,大写的M。

调试信息的打印

$(warning "the  OS is$(VERSION)")
$(info "the  OS is$(VERSION)")
$(error "the  OS is$(VERSION)")

其中,error会停在打印的地方。

makefile中的ifdef

ifdef hhh
$(info hahah)
endif

执行的时候可以通过make hhh=1 这种来进行定义
注意,这里的$(info hahah)是顶格的,没有Tab键。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java入门合集】第五章抽象类和接口(二)

博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 1.了解什么是抽象类&#xff0c;什么是接口&#xff1b; 2.掌握抽象类和接口的定义方法&#xff1b; 3.理解接口和抽象类的使用场景&#xff1b; 4.掌握多态的含义和用法&#xff1b; 5.掌握内部类的定义方法和使用…

【Hive实战】Hive元数据存储库数据增多的分析

Hive元数据存储库数据增多的分析 2023年5月8日 文章目录 Hive元数据存储库数据增多的分析问题新增Hive相关的DDL操作创建Hive库库授权到用户 创建Hive表 内部表非分区表表授权到用户一级分区表二级分区表分桶表分桶排序表 查询指令核心表分析表关系图表以库表为主以hive表为主以…

人人都可用的ChatGPT,Edge浏览器-免费ChatGPT保姆级教程!非常详细!

人工智能大浪潮已经来临&#xff0c;对于ChatGPT&#xff0c;我觉得任何一个玩互联网的人&#xff0c;都应该重视起来&#xff0c;用起来。但是国内使用需要解决科学上网、注册、收费等繁琐问题。 所以&#xff0c;今天这篇文章就来推荐一个插件&#xff0c;无需任何繁琐操作&…

第一次省赛团队训练 - BAPC 2022 Pre(DAPC 2022)

B (2). Bubble-bubble Sort [ 提交记录 ] [ 问题 3462 ] 时间限制: 2000MS 空间限制: 256MB 结果评判: 文本对比 正确/提交: 7 (5) / 15 官方标签: 用户标记: 题目描述 Bubbles! As a fanatical supporter of the Bubbles Are Perfect Creatures movement, you have ac…

第8章 未执行缓存的强制清理操作导致显示异常解决方案

1 异常产生原因&#xff1a; 由于未为Role实体定义相就的缓存强制销毁器类&#xff1a;Services.Customers.Caching.RoleCacheEventConsumer,从而导致Services.Events.EventPublisher.PublishAsync<TEvent>(TEvent event)中的 consumers实例为0,如下图所示&#xff1a; 2…

深入理解移动端布局:Viewport与设备像素比

在移动端开发中&#xff0c;了解和掌握不同设备的布局特点是非常重要的。本文将介绍两个关键概念&#xff1a;Viewport 和设备像素比&#xff08;DPR&#xff09;&#xff0c;帮助你更好地理解移动端布局。 一、什么是 Viewport&#xff1f; Viewport 是用户在浏览器中可见的网…

JS知识点(包括原型,原型对象,数据类型,数据类型的检测)

目录 1、JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; 2、基本数据类型和引用数据类型地区别&#xff1a; 3、数据类型检测的方式有哪些: 4、判断数组的方式有那些&#xff1f; 5、null和undefined区别&#xff1a; 6、为什么typeOf null得到object而不是n…

22个提升生产力的工具推荐,稳了

子曰&#xff1a;工欲善其事&#xff0c;必先利其器。 本文给大家推荐22个提高生产力的工具&#xff0c;总有一款符合你的需求。&#x1f604;&#x1f604;&#x1f604; 提高生产效率工具推荐 滴答清单/Todoist文件检索利器&#xff1a;Everything文件管理软件-Allen Explor…

基于SpringBoot的大学生租房系统

背景 大学生租房系统设计的目的是建立一个高效的平台&#xff0c;采用简洁高效的Java语言与Mysql数据库等技术&#xff0c;设计和开发了本大学生租房系统设计。该系统主要实现了用户和房主通过系统注册用户&#xff0c;登录系统后能够编辑自己的个人信息、查看首页&#xff0c…

【电子学会】2023年03月图形化三级 -- 猫猫的儿童节

猫猫的儿童节 儿童节到了&#xff0c;给小猫绘制一个七彩的气球。 1. 准备工作 &#xff08;1&#xff09;保留小猫角色&#xff1b; &#xff08;2&#xff09;选择“Button2”角色&#xff0c;添加文字“开始”&#xff1b; &#xff08;3&#xff09;默认白色背景。 2…

有人抱怨Android找不到工作,有人却收到了好几个Offer~

不知不觉&#xff0c;往年常说的面试黄金季就这样过去了&#xff0c;相信现在很多人都会抱怨说&#xff0c;现在是市场岗位缩水裁员季。有人抱怨&#xff0c;自然也有人喜悦&#xff0c;有失业人群在&#xff0c;自然就业人群也有&#xff0c;有人想找一份合理工作很难&#xf…

C高级(day1)

作业: 初始工作路径不在家目录下&#xff0c;在不切换路径的情况下&#xff0c;在家目录下创建一个subdir目录&#xff0c;在subdir这个目录下&#xff0c;创建subdir1和subdir2&#xff0c;并且把/etc/passwd拷贝到subdir1中&#xff0c;把/etc/group文件拷贝到subdir2中&…

David Silver Lecture 5: Model-Free Control

1 Introduction 1.1 内容 上一章是对一个unknown MDP进行value function的预测&#xff0c;相当于policy evaluation。这一章是对unknown MDP找到一个最优的policy&#xff0c; optimise value function. 1.2 On and Off-Policy Learning On-policy learning learn on the…

[oeasy]python0050_动态类型_静态类型_编译_运行

动态类型_静态类型 回忆上次内容 上次了解了 帮助文档的 生成 开头的三引号注释 可以生成 帮助文档文档 可以写成网页 python3 本身 也有 在线的帮助手册 目前的程序 提高了 可读性 有什么方法 可以让程序 更可读么&#xff1f;&#x1f914; 变量名 首先 在变量名上想办…

opencv_c++学习(六)

一、视频加载与摄像头调用 视频、摄像头加载 VideoCapture(filename, CAP_ANY)对以上实例解释如下&#xff1a; 若读取的为本地视频&#xff0c;则filename为视频名称&#xff0c;若读取的是摄像头数据&#xff0c;则为int类型的摄像头id。 视频属性的获取 视频属性可以通过…

手握美团offer,结果背调红灯,哭了....

相信很多人都会包装简历&#xff0c;尤其是工作经历&#xff0c;不过也有人会填一下虚假的背景信息&#xff0c;比如公司leader或HR&#xff0c;小公司没有实力过多进行背调&#xff0c;但是大企业就不同了&#xff0c;他们有方法了解到实际的情况。 背调包括候选人以往的经历…

RHCSA之Linux的安装步骤

目录 RHCSA之环境配置 需要的软件 VMwareWorkstation安装 1.打开VMwareWorkstation安装包 2.进入安装界面点击下一步 3. 在我接受许可协议打 √ 后&#xff0c;点击下一步 4.在安装位置选择更改 5. 更改目标安装位置&#xff0c;点击确定 6.疯狂点击下一步 8.点击安装 9.…

DDIM模型代码实现

背景 前面已经出了一系列的文章来介绍大模型、多模态、生成模型。这篇文章会从更微观和更贴近实际工作的角度下手。会给大家介绍下前面讲到的diffuiosn model具体怎么来实现。文章结构如下&#xff1a; 1.介绍Diffusion Model包括哪些零部件&#xff0c;这些零部件衔接关系 …

jvm梳理

jvm是一个虚拟机&#xff0c;用于运行java代码&#xff0c;类的编译到运行主要为一下&#xff1a; 通过javac.exe编译&#xff0c;产生class文件&#xff0c;然后通过类加载器加入jvm&#xff1a; 类加载器&#xff1a; 引导加载器&#xff1a;使用c编写&#xff0c;负责java的…

【高项】项目绩效域,信息文档配置与变更,标准与规范管理(第4版教材第18-19,24章,项目规范知识)

文章目录 1、配置与变更管理1.1 信息文档1.2 配置管理1.3 变更管理 2、标准规范&#xff08;合同管理&#xff0c;知识产权&#xff09;2.1 合同管理2.2 知识产权和标准规范&#xff08;合同法&#xff0c;招投标法&#xff0c;著作权法&#xff0c;政府采购法&#xff09;2.3 …