ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

嵌入式开发学习日志(多文件工程、Makefile) day17 持续更新中

2026/8/12 18:47:17 拓冰建站 浏览量
嵌入式开发学习日志(多文件工程、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 命令执行。使用自定义变量简化维护掌握$ $^ $自动变量简化编译脚本。