makefile模块独立编译的支持方法是什么-创新互联

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

目前创新互联公司已为千余家的企业提供了网站建设、域名、网络空间、网站托管、企业网站设计、拱墅网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

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

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

        下来我们来看看具体的 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!"

        我们来看看编译结果

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

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

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

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

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

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

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

        下面我们看看改变后的 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 .. ; endef all : 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模块独立编译的支持方法是什么

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

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

新闻名称:makefile模块独立编译的支持方法是什么-创新互联
路径分享:https://www.cdcxhl.com/article36/cscdsg.html

成都网站建设公司_创新互联,为您提供网站策划网页设计公司域名注册建站公司标签优化网站设计

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都做网站