C语言Makefile编写与使用指南

Makefile 详细指南:编写与使用

Makefile 是 C/C++ 项目中常用的自动化构建工具,它定义了项目的编译规则和依赖关系。下面我将详细介绍 Makefile 的编写和使用方法。

一、Makefile 基础

1. 基本结构

一个典型的 Makefile 包含以下部分:

makefile

复制

下载

target: dependenciescommand
  • target:通常是生成的文件名,也可以是一个动作名称(伪目标)

  • dependencies:生成 target 所需的文件或其它 target

  • command:需要执行的命令(必须以 Tab 开头)

2. 简单示例

makefile

复制

下载

hello: hello.cgcc hello.c -o hello

二、Makefile 核心语法

1. 变量定义与使用

makefile

复制

下载

CC = gcc
CFLAGS = -Wall -O2
TARGET = program$(TARGET): main.c utils.c$(CC) $(CFLAGS) main.c utils.c -o $(TARGET)

2. 自动变量

  • $@:当前目标名

  • $<:第一个依赖项

  • $^:所有依赖项

  • $?:比目标新的依赖项列表

makefile

复制

下载

program: main.o utils.o$(CC) $^ -o $@main.o: main.c$(CC) $(CFLAGS) -c $< -o $@utils.o: utils.c$(CC) $(CFLAGS) -c $< -o $@

3. 通配符与模式规则

makefile

复制

下载

# 匹配所有.c文件
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)%.o: %.c$(CC) $(CFLAGS) -c $< -o $@

4. 函数

常用函数:

  • $(wildcard pattern):文件列表

  • $(patsubst pattern,replacement,text):模式替换

  • $(shell command):执行 shell 命令

makefile

复制

下载

SRCS = $(wildcard src/*.c)
OBJS = $(patsubst src/%.c,obj/%.o,$(SRCS))

三、完整项目示例

makefile

复制

下载

# 编译器设置
CC = gcc
CFLAGS = -Wall -Wextra -O2
LDFLAGS = -lm# 目录设置
SRCDIR = src
OBJDIR = obj
BINDIR = bin# 文件设置
TARGET = $(BINDIR)/program
SRCS = $(wildcard $(SRCDIR)/*.c)
OBJS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))# 默认目标
all: $(TARGET)# 链接目标
$(TARGET): $(OBJS) | $(BINDIR)$(CC) $(LDFLAGS) $^ -o $@# 编译规则
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)$(CC) $(CFLAGS) -c $< -o $@# 创建目录
$(BINDIR) $(OBJDIR):mkdir -p $@# 清理
clean:rm -rf $(OBJDIR) $(BINDIR)# 伪目标声明
.PHONY: all clean

四、Makefile 使用

1. 基本命令

  • make:执行第一个目标(通常是 all)

  • make target:执行指定目标

  • make clean:执行清理操作

  • make -n:显示但不执行命令(干跑)

  • make -j4:使用 4 个线程并行编译

2. 常用选项

  • -B:强制重新编译所有目标

  • -C dir:切换到指定目录后执行

  • -f file:指定使用的 Makefile 文件

五、高级技巧

1. 条件判断

makefile

复制

下载

ifeq ($(DEBUG),1)CFLAGS += -g -DDEBUG
elseCFLAGS += -O2
endif

2. 包含其他 Makefile

makefile

复制

下载

include config.mk

3. 自动依赖生成

makefile

复制

下载

DEPFLAGS = -MMD -MP
CFLAGS += $(DEPFLAGS)-include $(OBJS:.o=.d)

六、最佳实践

  1. 使用变量存储常用命令和参数

  2. 将中间文件与源文件分离

  3. 为每个子目录创建单独的 Makefile

  4. 使用 -include 包含依赖文件

  5. 声明 .PHONY 目标

  6. 添加 help 目标说明用法

makefile

复制

下载

.PHONY: help
help:@echo "Usage: make [target]"@echo ""@echo "Targets:"@echo "  all     Build the program (default)"@echo "  clean   Remove generated files"@echo "  help    Show this help message"

通过以上内容,你应该能够编写和使用 Makefile 来管理 C 语言项目了。Makefile 的灵活性很高,可以根据项目需求进行调整和扩展。

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

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

相关文章

Centos离线安装Docker(无坑版)

1、下载并上传docker离线安装包 官方地址&#xff1a;安装包下载 2、上传到离线安装的服务器解压 tar -zxvf docker-28.1.1.tgz#拷贝解压二进制文件到相关目录 cp docker/* /usr/bin/ 3、创建docker启动文件 cat << EOF > /usr/lib/systemd/system/docker.servic…

OceanBase数据库-学习笔记4-租户

租户 租户偏向于资源层面的逻辑概念&#xff0c;是在物理节点上划分的资源单元&#xff0c;可以指定其资源规格&#xff0c;包括 CPU、内存、日志盘空间、IOPS 等。 租户类似于传统数据库的数据库实例&#xff0c;租户通过资源池与资源关联&#xff0c;从而独占一定的资源配额…

UNIAPP项目记录

一、通过 vue-cli 创建 uni-app 项目 创建 vue3 项目 创建以 javascript 开发的工程&#xff08;如命令行创建失败&#xff0c;请直接访问 gitee 下载模板&#xff09; npx degit dcloudio/uni-preset-vue#vite my-vue3-project复制代码 npx degit dcloudio/uni-preset-vue#vit…

华为发布全球首个L3商用智驾ADS4.0

2024年10月2024世界智能网联汽车大会上&#xff0c;余承东讲到&#xff1a;“华为ADS 4.0将于2025年推出高速L3级自动驾驶商用及城区L3级自动驾驶试点&#xff0c;希望加快L3级自动驾驶标准的进程&#xff0c;推动L3级自动驾驶技术的普及。” 世界智能网联汽车大会演讲PPT 所以…

【Python学习路线】零基础到项目实战

目录 &#x1f31f; 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 &#x1f9e0; 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 &#x1f4bb; 二、实战演示环境配置要求核心代码实现运行结果验证 ⚡ 三、性能对比测试方法论量化数据对比…

解决redis序列号和反序列化问题

最近遇到了一个问题,将 List<Map<String, Object>> 类型数据以list形式存入到redis之后,发现取出来时数据格式完全不对,根据报错信息发现是反序列化问题,遇到类似问题,主要有两种解决方案1.使用序列号工具 例如&#xff0c;Java中常用的序列化工具有Jackson、Gso…

Android学习总结之设计场景题

设计图片请求框架的缓存模块 核心目标是通过分层缓存策略&#xff08;内存缓存 磁盘缓存&#xff09;提升图片加载效率&#xff0c;同时兼顾内存占用和存储性能。以下是针对 Android 面试官的回答思路&#xff0c;结合代码注释说明关键设计点&#xff1a; 一、缓存架构设计&…

Webug3.0通关笔记14 第十四关:存储型XSS

目录 第十四关:存储型XSS 1.打开靶场 2.源码分析 3.渗透实战 第十四关:存储型XSS 本文通过《webug3靶场第十四关 存储型XSS》来进行存储型XSS关卡的渗透实战。 存储型 XSS&#xff08;Stored Cross - Site Scripting&#xff09;&#xff0c;也被称为持久型 XSS&#xff…

Java父类、子类实例初始化顺序详解

1、完整的初始化顺序&#xff08;含继承&#xff09; 1、父类的静态初始化 父类静态变量默认值 → 父类静态变量显式赋值 父类静态代码块&#xff08;按代码顺序执行&#xff09;。 2、子类的静态初始化 子类静态变量默认值 → 子类静态变量显式赋值 子类静态代码块&…

13.组合模式:思考与解读

原文地址:组合模式&#xff1a;思考与解读 更多内容请关注&#xff1a;7.深入思考与解读设计模式 引言 在软件开发中&#xff0c;是否曾经遇到过这样一种情况&#xff1a;你有一个对象&#xff0c;它本身很简单&#xff0c;但是它包含了其他类似的对象。随着系统变得越来越复…

OpenCV实战教程 第一部分:基础入门

第一部分&#xff1a;基础入门 1. OpenCV简介 什么是OpenCV及其应用领域 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;于1999年由Intel公司发起&#xff0c;现在由非营利组织OpenCV.org维护。Ope…

虚幻商城 Quixel 免费资产自动化入库(2025年版)

文章目录 一、背景二、问题讲解1. Quixel 免费资产是否还能一键入库?2. 是不是使用了一键入库功能 Quixel 的所有资产就能入库了?3. 一键入库会入库哪些资产?三、实现效果展示四、实现自动化入库五、常见问题1. 出现401报错2. 出现429报错3. 入库过于缓慢4. 入库 0 个资产一…

uni-app - 小程序使用高德地图完整版

文章目录 🍉功能描述🍉效果🍉开发环境🍉代码部分🍉功能描述 页面自动通过定位获取用户位置并展示周边POI数据,同时支持关键词输入实时联想推荐关联地点信息, 实现精准智能的地点发现与检索功能。 🍉效果 🍉开发环境 unibest2.5.4nodev18.20.5pnpm9.14.2wot-des…

牛客:AB4 逆波兰表达式求值

链接&#xff1a;逆波兰表达式求值_牛客题霸_牛客网 题解&#xff1a; 利用栈&#xff0c;遍历字符串数组&#xff0c;遇到运算数则入栈&#xff0c;遇到运算符则取出栈顶两个运算数进行运算&#xff0c;并将运算结果入栈。 class Solution { public:/*** 代码中的类名、方法…

Ant(Ubuntu 18.04.6 LTS)安装笔记

一、前言 本文与【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安装笔记】同批次&#xff1a;先搭建数据库&#xff0c;再安装JDK&#xff0c;后面肯定就是部署Web应用。其中Web应用的部署使用 Ant 方式&#xff0c;善始善终&#xff0c;特以笔记。 二、准备 &#xf…

ultralytics 目标检测 混淆矩阵 背景图像 没被记录

修改 utils/metrics.py ConfusionMatrix def process_batch(self, detections, gt_bboxes, gt_cls):"""Update confusion matrix for object detection task.Args:detections (Array[N, 6] | Array[N, 7]): Detected bounding boxes and their associated inf…

iview 如何设置sider宽度

iview layout组件中&#xff0c;sider设置了默认宽度和最大宽度&#xff0c;在css样式文件中修改无效&#xff0c;原因是iview默认样式设置在了element.style中&#xff0c;只能通过行内样式修改 样式如下&#xff1a; image.png image.png 修改方式&#xff1a; 1.官方文档中写…

go-zero(十七)结合DTM :实现分布式事务

1. 基础概念介绍 1.1 什么是分布式事务 在微服务架构中&#xff0c;一个业务操作常常需要调用多个服务来完成。例如&#xff0c;在电商系统中下单时&#xff0c;需要同时操作订单服务和库存服务。这种跨服务的操作就需要分布式事务来保证数据一致性。 分布式事务面临以下挑战…

2025 简易Scrum指南(简体中文版)

Scrum是一个轻量级的、以团队为中心的框架&#xff0c;用于解决复杂的问题并创造价值。Scrum有意保持非完整性&#xff0c;Scrum的设计初衷旨在依靠使用者的集体智慧来不断演进构建。 Scrum建立在实验主义和精益思想的基础上&#xff0c;它赋能团队灵活巧妙地工作&#xff0c;…

2025最新福昕PDF编辑器,PDF万能处理工具

软件介绍 Foxit PDF Editor Pro 2025 中文特别版&#xff08;以前称为 Foxit PhantomPDF Business&#xff09;是一款专为满足各种办公需求而设计的业务就绪的PDF工具包。 软件特点 1. 强大的PDF编辑能力 创建新文档&#xff1a;用户可以从无到有地构建PDF文档&#xff0c;添…