千家信息网

变量与函数的综合示例(九)

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,之前我们学习了 makefile 中的变量及函数的相关语法知识,那么我们今天就来以实际需求为例来进行实际编写。实战需求:1、自动生成 target 文件夹存放可执行文件;2、自动生成 objs 文件夹
千家信息网最后更新 2026年11月03日变量与函数的综合示例(九)

之前我们学习了 makefile 中的变量及函数的相关语法知识,那么我们今天就来以实际需求为例来进行实际编写。实战需求:1、自动生成 target 文件夹存放可执行文件;2、自动生成 objs 文件夹存放编译生成的目标文件(*.o);3、支持调试版本的编译选项;4、考虑代码的扩展性。

那么在进行今天的 makefile 编写之前,我们还需要了解下几个知识点:a> $(wildcard _pattern),它的作用是获取当前工作目录中满足 _pattern 的文件或目录列表;b> $(addprefix _prefix,_names),它的作用是给名字列表 _names 中的每一个名字增加前缀 _prefix。

其中的关键技巧:1、自动获取当前目录下的源文件列表(函数调用):SRCS := $(wildcard *.c);2、根据源文件列表生成目标文件列表(变量的值替换):OBJS := $(SRCS:.c=.o);3、对每一个目标列表加上路径前缀(函数调用):OBJS := $(addprefix path/, $(OBJS))。

我们来看看规则中的模式替换(目录结构),如下

看看编译规则的依赖,如下

下来我们来看看具体的 makefile 是怎样编写的,还是以之前的那三个 .c 文件为源文件。

CC := gccMKDIR := mkdirRM := rm -rfDIR_OBJS := objsDIR_TARGET := targetDIRS := $(DIR_OBJS) $(DIR_TARGET)TARGET := $(DIR_TARGET)/hello-makefile.out# main.c func.c const.cSRCS := $(wildcard *.c)# main.o func.o const.oOBJS := $(SRCS:.c=.o)# objs/main.o objs/func.o objs/const.oOBJS := $(addprefix $(DIR_OBJS)/, $(OBJS)).PHONY : rebuild clean all$(TARGET) : $(DIRS) $(OBJS)    $(CC) -o $@ $(OBJS)    @echo "Target File ==> $@"$(DIRS) :    $(MKDIR) $@$(DIR_OBJS)/%.o : %.c    ifeq ($(DEBUG),true)        $(CC) -o $@ -g -c $^    else        $(CC) -o $@ -c $^    endifrebuild : clean allall : $(TARGET)clean :    $(RM) $(DIRS)

我们来看看编译效果

我们看到已经正确执行了,在当前目录下自动生成两个文件夹 objs target。在 objs 文件夹里生成三个 .o 文件,在 target 文件夹中生成 hello-makefile.out 文件,执行这个可执行文件,结果也是我们之前定义的。下来我们来看看能不能定义 DEBUG 版的程序,这时便要用到一个命令了 objdump -S target,它用于来查看程序是否为调试版。下来我们来看看结果,图 a 为普通版的,图 b 为 DEBUG 版的

图 a 普通版

图 b DEBUG 版

我们看到 DEBUG 版本相对于普通版来说,多了一些东西,比如我们在里面写的 printf 语句,而且多了函数调用的语句。普通版则是只执行程序就 OK 了。通过今天的综合示例的编写,总结如下:1、目录是可以成为目标的依赖的,在规则中创建目录;2、预定义函数是 makefile实战时不可或缺的部分;3、规则中的模式匹配可以直接针对目录中的文件;4、可以使用命令行变量编译特殊的目标版本。


欢迎大家一起来学习 makefile 语言,可以加我QQ:243343083。

文件 目录 生成 函数 文件夹 目标 编译 普通 规则 变量 源文件 版本 程序 自动生成 三个 作用 前缀 名字 命令 实战 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 上海卓越科技互联网 中国互联网科技工作委员会毛军 科技和互联网公司 金诺互联网科技 互联网 的科技创新 天津摩尔互联网科技 苏州大垚互联网科技 卓越科技互联网 招聘 深圳卡尔迅互联网科技有限公司怎么样 富国互联网科技创新基金 互联网科技实习生岗位职责 互联网对科技的发展 世界互联网科技公司市值排名 青海科技产业互联网发展 洛阳共同富裕互联网科技有限公司 艺电能源互联网科技有限公司招聘 科技信息时代互联网发展 承德科技产业互联网平台 恒生科技互联网指数十大成分股 亿账通互联网科技 重庆科技学院互联网 湖南诚度互联网科技有限公司 互联网公司科技股 翼展科技 首家互联网医院 群盈汇互联网科技有限公司 广州千川互联网科技有限公司 城市宝互联网科技有限公司 江苏互联网科技小贷 宁波允成互联网科技有限公司
0