嵌入式开发学习日志(多文件工程、Makefile) day17 持续更新中
前言在小型 C 语言项目中代码量少可以全部写在一个.c文件里。当项目规模变大全部代码写在单个源文件会造成维护困难、可读性差、不利于团队协作。这时就要使用多文件工程管理配合Makefile工具实现项目自动化编译。本文梳理头文件、源文件分工、全局变量跨文件使用、Makefile 语法与变量相关知识点。一、C 语言多文件工程结构C 工程主要分为 \\头文件.h和源文件.c\\两类文件。1. 头文件.h职责头文件只做声明不做实现包含需要的其他头文件数据类型声明结构体、枚举、typedef 等函数声明全局变量声明使用extern宏定义⚠️注意头文件中不要定义函数实体、不要初始化全局变量否则多次 include 会出现重复定义报错。2. 源文件.c职责源文件做定义与实现包含需要的头文件一定要包含自身对应的.h头文件函数的具体实现函数体全局变量的定义可以初始化工程一般是一对多关系一个.h头文件对应一个.c实现文件多个模块就有多组 h‑c 文件。main.c 作为程序入口包含各个模块头文件调用模块函数。二、全局变量跨文件使用规则全局变量在多文件项目中极易出现重复定义错误严格遵守下面 4 条规则全局变量在源文件.c中定义可以初始化。如果只在定义该变量的.c内部使用不需要额外声明。如果要在其他外部源文件使用这个全局变量必须做外部声明。在对应头文件中使用extern关键字做变量声明extern 声明时不能给变量初始化。示例// test.c 源文件定义全局变量 int g_num 100; // test.h头文件extern声明供别的.c文件使用 extern int g_num;其他文件只要#include test.h就可以访问g_num。❌错误头文件写extern int g_num100;这变成定义会重复定义。三、Makefile 工程编译管理3.1 Makefile 是什么Makefile 用于管理代码工程的编译、链接由make工具解释执行实现一键编译链接整个工程不用手动敲很长 gcc 命令。文件名可以为Makefile或者makefile。3.2 Makefile 基础语法规则目标文件: 依赖文件 编译规则命令 #❗前面必须是Tab键不能用空格目标文件想要生成的文件比如可执行程序a.out依赖文件生成目标所需要的文件一般是.c源码编译规则gcc 编译命令生成目标。示例a.out: main.c sum.c sub.c div.c gcc main.c sub.c sum.c div.c -I头文件路径 -L库的位置编译运行终端直接输入命令makegcc 参数说明-I(大写 i)指定头文件搜索路径-L指定库文件搜索路径四、Makefile 中的变量变量可以简化 Makefile便于后期维护修改只需要改变量不用修改多处编译命令。4.1 自定义变量定义格式变量名 值引用格式$(变量名)。#定义变量 OBJ a.out SRC main.c sum.c sub.c #引用变量 $(OBJ) 等价于 a.out变量赋值运算符运算符作用普通赋值给变量赋值追加赋值在原有变量基础上新增内容?条件赋值变量未赋值才赋值已有值则保留原值示例SRC main.c SRC sum.c # SRC变为 main.c sum.c4.2 Makefile 内置系统自动变量直接使用自动变量含义$代表当前规则的目标文件$^代表所有的依赖文件$代表第一个依赖文件4.3 完整 Makefile 示例#自定义变量 OBJ a.out SRC main.c SRC sum.c SRC sub.c SRC div.c CC gcc INCLUDE ../include LIBS ../lib #编译规则 $(OBJ): $(SRC) $(CC) $^ -o $ -I$(INCLUDE) -L$(LIBS) -lm #伪目标清理编译产物 clean: rm $(OBJ)使用make执行编译生成 a.outmake clean执行 clean 规则删除可执行文件补充clean没有依赖属于伪目标一般用来删除编译生成的产物。五、常见踩坑总结❌头文件写函数实现、初始化全局变量多次#include触发重复定义报错。 ✅头文件放声明.c文件放实现与变量定义。❌extern int g_val 10;头文件 extern 声明带初始化。 ✅extern 只是声明不能初始化定义写在.c。❌Makefile 编译命令前面用空格不是 Tab直接报语法错误。 ✅规则行命令开头必须是 Tab。❌忘记-I指定头文件路径头文件找不到报错。❌手动敲很长 gcc 命令文件一多修改麻烦。 ✅用 Makefile 变量统一管理。小结.h负责声明.c负责实现多文件工程遵循声明与实现分离。全局变量在.c定义.h中用 extern 做外部声明禁止 extern 时初始化。Makefile 格式目标:依赖Tab 开头写编译命令make 命令执行。使用自定义变量简化维护掌握$ $^ $自动变量简化编译脚本。

相关新闻

C++与C语言核心差异解析:从过程式到多范式编程的思维升级

C++与C语言核心差异解析:从过程式到多范式编程的思维升级

1. 项目概述:为什么C程序员必须理解与C的差异 如果你是从C语言转向C,或者正在纠结于“学了C之后还有必要学C吗”这个问题,那么你找对地方了。我见过太多初学者,包括当年的我自己,把C简单地理解为“带类的C”&#xff0…

2026/10/31 20:53:18 阅读更多 →
是不是就是看什么

是不是就是看什么

fsdghgfaghfds

2026/10/26 11:23:18 阅读更多 →
UNIX V6++进程管理:从原理到实践

UNIX V6++进程管理:从原理到实践

1. UNIX V6进程管理概述 在计算机科学领域,进程管理是操作系统最核心的功能之一。UNIX V6作为经典操作系统的现代实现版本,其进程管理机制既保留了传统UNIX的设计精髓,又融入了当代操作系统的优化思想。理解UNIX V6如何管理程序的执行&#x…

2026/10/24 15:18:59 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/31 0:19:11 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/31 10:20:19 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/31 10:20:23 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/31 0:59:28 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/31 10:30:19 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/31 9:29:43 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 18:03:41 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 11:00:40 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 0:09:01 阅读更多 →