千家信息网

makefile模块独立编译的支持方法是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"makefile模块独立编译的支持方法是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
千家信息网最后更新 2026年11月02日makefile模块独立编译的支持方法是什么

本篇内容介绍了"makefile模块独立编译的支持方法是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

解决方案便是:1、将模块名(module)作为目标名(伪目标)建立规则;2、目标(module)对应的依赖为 build build/module;3、规则中的命令进入对应的模块文件夹进行编译;4、编译结果存放于 build 文件夹下。其关键技术点是如何获取 make 命令行中指定编译的模块名,通过预定义变量:$(MAKECMDGOALS),命令行中指定的目标名(make 的命令行参数)。如下

下来我们来看看具体的 makefile 是怎样写的,将上节博客中的 pro-rule.mk 改成下面这样

.PHONY : all compile link clean rebuild $(MODULES)DIR_PROJECT := $(realpath .)DIR_BUILD_SUB := $(addprefix $(DIR_BUILD)/, $(MODULES))MODULE_LIB := $(addsuffix .a, $(MODULES))MODULE_LIB := $(addprefix $(DIR_BUILD)/, $(MODULE_LIB))APP := $(addprefix $(DIR_BUILD)/, $(APP))all : compile $(APP)    @echo "Success! Target ==> $(APP)"compile : $(DIR_BUILD) $(DIR_BUILD_SUB)    @echo "Begin to compile ..."    @set -e; \    for dir in $(MODULES); \    do \        cd $$dir && \        $(MAKE) all \            DEBUG:=$(DEBUG) \            DIR_BUILD:=$(addprefix $(DIR_PROJECT)/, $(DIR_BUILD)) \            DIR_COMMON_INC:=$(addprefix $(DIR_PROJECT)/, $(DIR_COMMON_INC)) \            CMD_CFG:=$(addprefix $(DIR_PROJECT)/, $(CMD_CFG)) \            MOD_CFG:=$(addprefix $(DIR_PROJECT)/, $(MOD_CFG)) \            MOD_RULE:=$(addprefix $(DIR_PROJECT)/, $(MOD_RULE)) && \        cd .. ; \    done    @echo "Compile Success!"    link $(APP) : $(MODULE_LIB)    @echo "Begin to link ..."    $(CC) -o $(APP) -Xlinker "-(" $^ -Xlinker "-)" $(LFLAGS)    @echo "Link Success!"    $(DIR_BUILD) $(DIR_BUILD_SUB) :     $(MKDIR) $@    clean :     @echo "Begin to clean ..."    $(RM) $(DIR_BUILD)    @echo "Clean Success!"    rebuild : clean all$(MODULES) : $(DIR_BUILD) $(DIR_BUILD)/$(MAKECMDGOALS)    @echo "Begin to compile $@"    @set -e; \    for dir in $(MODULES); \    do \        cd $@ && \        $(MAKE) all \            DEBUG:=$(DEBUG) \            DIR_BUILD:=$(addprefix $(DIR_PROJECT)/, $(DIR_BUILD)) \            DIR_COMMON_INC:=$(addprefix $(DIR_PROJECT)/, $(DIR_COMMON_INC)) \            CMD_CFG:=$(addprefix $(DIR_PROJECT)/, $(CMD_CFG)) \            MOD_CFG:=$(addprefix $(DIR_PROJECT)/, $(MOD_CFG)) \            MOD_RULE:=$(addprefix $(DIR_PROJECT)/, $(MOD_RULE)) && \        cd .. ; \    done    @echo "Compile Success!"

我们来看看编译结果

我们看到 common 模块已经正确编译了,而且生成相应的 common.a 文件了。我们再继续编译别的两个模块,再通过链接的命令看看可执行程序 app.out 是否可以生成

我们看到可执行程序 app.out 已经正确生成了。那么我们看到刚才的模块编写是直接复制之前的代码,凡是涉及到复制粘贴的代码,我们得看看是否可以封装成类似于函数的形式。在 makefile 中的代码复用规则是这样的,当不同规则中的命令大量重复时,可考虑自定义函数,makefile 中的自定义函数是代码复用的一种方式。如下

具体思路就是:1、将编译模块的命令作为自定义函数的具体实现;2、函数参数为模块名,函数调用后编译参数指定的模块;3、在不同的规则中调用该函数。如下

下面我们看看改变后的 makefile 是怎样的,将前面的 pro-rule.mk 改成下面这样

.PHONY : all compile link clean rebuild $(MODULES)DIR_PROJECT := $(realpath .)DIR_BUILD_SUB := $(addprefix $(DIR_BUILD)/, $(MODULES))MODULE_LIB := $(addsuffix .a, $(MODULES))MODULE_LIB := $(addprefix $(DIR_BUILD)/, $(MODULE_LIB))APP := $(addprefix $(DIR_BUILD)/, $(APP))define makemodule    cd ${1} && \    $(MAKE) all \        DEBUG:=$(DEBUG) \        DIR_BUILD:=$(addprefix $(DIR_PROJECT)/, $(DIR_BUILD)) \        DIR_COMMON_INC:=$(addprefix $(DIR_PROJECT)/, $(DIR_COMMON_INC)) \        CMD_CFG:=$(addprefix $(DIR_PROJECT)/, $(CMD_CFG)) \        MOD_CFG:=$(addprefix $(DIR_PROJECT)/, $(MOD_CFG)) \        MOD_RULE:=$(addprefix $(DIR_PROJECT)/, $(MOD_RULE)) && \    cd .. ;endefall : compile $(APP)    @echo "Success! Target ==> $(APP)"compile : $(DIR_BUILD) $(DIR_BUILD_SUB)    @echo "Begin to compile ..."    @set -e; \    for dir in $(MODULES); \    do \        $(call makemodule, $$dir) \    done    @echo "Compile Success!"    link $(APP) : $(MODULE_LIB)    @echo "Begin to link ..."    $(CC) -o $(APP) -Xlinker "-(" $^ -Xlinker "-)" $(LFLAGS)    @echo "Link Success!"    $(DIR_BUILD) $(DIR_BUILD_SUB) :     $(MKDIR) $@    clean :     @echo "Begin to clean ..."    $(RM) $(DIR_BUILD)    @echo "Clean Success!"    rebuild : clean all$(MODULES) : $(DIR_BUILD) $(DIR_BUILD)/$(MAKECMDGOALS)    @echo "Begin to compile $@"    @set -e; \    $(call makemodule, $@)

编译的结果是

"makefile模块独立编译的支持方法是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

模块 编译 函数 命令 规则 代码 目标 参数 文件 结果 生成 方法 支持 独立 不同 中指 内容 文件夹 更多 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海睿民互联网科技有限公司 广州大一互联网络科技有限公司 互联网科技巨头监管 关于新基建和互联网科技 互联网公司 科技公司 互联网医疗科技 亿策互联网科技 唐信互联网科技 大连 奔汉互联网科技 互联网养老 桔豆科技 互联网金融监管科技 上海宁丞科技互联网 花神(南京)互联网科技有限公司 中国科技创新与世界互联网大会 徐州市互联网科技有限公司 互联网企业科技类企业如何做账 广州百诚互联网科技有限公司官网 有人说阿里系是互联网科技企业 西安左小互联网科技有限公司 平安好医生打造互联网科技医疗 工业互联网科技新基建 北京华百购互联网科技有限公司 互联网科技公司实习生 中国科技创新与世界互联网大会 互联网方面的科技前沿 下一代互联网重大应用科技园 互联网科技手机排行榜 互联网科技新闻 优雇互联网科技有限公司 小牛互联网科技有限公司地址
0