当前位置: 首页 > news >正文

GNU Make | C/C++项目自动构建入门

简介

GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program’s source files.

GNU make 可以帮助你简化编译可执行文件的过程。举个例子,假设在你的工程文件夹project下有多个头文件与源文件,你希望最终生成一个可执行文件,以运行你的代码。

project
├── main.c
├── task1.c
├── task1.h
├── task2.c
└── task2.h

如果单独使用使用gcc命令进行编译、连接,那么就需要每次在修改代码后要执行以下代码:

$ gcc task1.c task2.c main.c -o test.exe

如果项目中的源文件有变化,那么每次都需要修改指令。此时使用Make不仅可以简化到只用输入make,就能完成上述工作,还大大提高了编译时的维护效率。
其实一些比较老的IDE,在用户点击编译时,就会生成一个makefile文件,然后自动运行这个makefile文件,从而完成编译任务。比如Dev C++:
在这里插入图片描述

语法规则

那么如何写一个makefile文件?
可以参考GNU Make的官方网站:
GNU make

基本规则

target : dependencies ...commands...

其中target为你希望生成的最终的目标文件, dependencies是一个或多个生成target时所必须的依赖文件;commands则对应在生成目标文件时希望使用的指令,可以理解为通过dependencies生成target时的方法。

例如,上文的例子可以翻译为对应的makefile代码:

test.exe : task1.c taks2.c main.cgcc task1.c task2.c main.c -o test.exe

然后每次需要重新编译文件的时候,直接输入“make”即可。

替换为变量

makefile文件可以像shell脚本那样定义变量、使用变量,这样可以让我们的makefile文件变得更加优雅。

SOURCE = "task1.c taks2.c main.c"
TARGET = "test.exe"
CC = "gcc"%(TARGET) : $(SOURCE)%(CC) $(SOURCE) -o %(TARGET)

makefile执行流程

一个.c文件生成最后的可执行文件,需要经过头文件展开、编译、链接等三步。当我们在makefile中指定依赖关系为‘*.exe : *.c’时,它会自动的递归找到现有的依赖文件,然后逐级生成.o文件,最后才得到可执行文件。

CC = gcc
OBJ = task1.o task2.o main.o
TARGET = test.exe$(TARGET) : $(OBJ)$(CC) -o $(TARGET) $(OBJ)task1.o : task1.c task1.h$(CC) -c task1.ctask2.o : task2.c task2.h$(CC) -c task2.cmain.o : main.c task1.h task2.h$(CC) -c main.c

该代码与上文的makefile代码等价。当直接在命令行执行“make”命令时,makefile默认会完成第一个依赖关系的任务。当然亦可以指定make的任务,程序会自动匹配依赖关系,然后执行对应的代码。

$ make [target file]

clean

当我们再次需要编译、生成可执行文件时,我们会希望清除原来的旧文件,makefile也可以帮助我们简化这一过程。在makefile中添加clean规则即可:

clean:rm -rf test *.o

.PHONY

.PHONY即Phony Target,伪目标。这是一个makefile的内建命令,常用以修饰clean规则。
makefile在执行任务的时候会检查依赖文件是否修改,makefile在执行某个任务时会检查当前任务所依赖的文件是否会修改,只有当当前目标文件的依赖文件发生修改,才会执行对应的生成命令。若文件中恰巧存在一个名为clean的文件时,由于其没有对应的依赖文件,所以这时clean任务将永远不会被执行。

在这里插入图片描述

使用.PHONY修饰后的任务,makefile将不会把该任务视为一个生成clean文件的任务,则不受上述规则限制,可以反复执行。所以一般使用clean规则的时候应这样写:

.PHONY:clean
clean:rm -rf test *.o

自动变量(Automatic Variables)

新手在编写自己的小型项目的时候可以用自动变量简化一些工作量,此处简单介绍几个比较常用的自动变量。
注意:自动变量在官方手册中并不建议使用,因为自动变量有局限性:

  • 只能在单个任务中有值,并不能全局访问。
  • 不能在依赖关系处使用
  • 代码的可读性较差

使用自动变量可以将任务该写为这样:

test.exe: task1.c task2.c main.cgcc $^ -o $@

$@

在一个任务中,代表目标文件。

$^

在一个任务中,代表所有的依赖文件

$*

在一个任务重,代表目标文件的文件名,即去掉后缀的部分。

http://www.xdnf.cn/news/1434925.html

相关文章:

  • DevOps运维与开发一体化及Kubernetes运维核心详解
  • Aurobay EDI 需求分析:OFTP2 与 EDIFACT 驱动的汽车供应链数字化
  • DataAgent技术解析:数据智能的未来之路
  • LangGraph 上下文工程权威指南:构建智能、感知、有记忆的 AI 代理
  • Ubuntu平台查看.gz格式压缩文件内容以及利用grep命令过滤搜索内容
  • 《浪浪山小妖怪》知识竞赛来袭!测测你是几级影迷?
  • RL【1】:Basic Concepts
  • 情况三:已经 add ,并且也 commit 了
  • 机器人控制器开发(整体架构2 Lerobot介绍)
  • 佛山体彩第二届唱享之夜浪漫收官, 七夕音乐派对全场大合唱!
  • 使用 Gulp + Webpack 打造一个完整的 TypeScript 库构建流程
  • 社区医疗健康管理系统的设计与实现-(源码+LW+可部署)
  • Linux92 shell:倒计时,用户分类
  • [re_2] rpc|http|nginx|protobuf|
  • HBuilder X 4.76 开发微信小程序集成 uview-plus
  • 【Linux我做主】进程退出和终止详解
  • C++编程语言:标准库:第37章——正则表达式(Bjarne Stroustrup)
  • 拷打字节面试官之-吃透c语言-哈希算法 如何在3面拷打字节cto 3万行算法源码带你吃透算法面试所有考题
  • 【完整源码+数据集+部署教程】鸡粪病害检测系统源码和数据集:改进yolo11-bifpn-SDI
  • 前端开发中经常提到的iframe、DOM是什么?
  • WPF中的DataContext以及常见的绑定方式
  • windows下wsl2 ubuntu开发配置
  • 破解人事管理非标化困境:启效云低代码如何助力业务突围?
  • 为什么同步是无线通信的灵魂?WiFi 与 5G 帧结构中的关键技术
  • 创建一个只能直接构造和销毁,但不能被复制和移动的基类
  • burpsuite使用之CaA神器使用
  • 2025年企业级数据服务API平台大全和接入指南
  • Text2SQL与DataAgent技术深度对比与实践指南
  • Java集合源码解析之LinkedList
  • 串口服务器技术详解:2025年行业标准与应用指南