加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

makefile中的错误

发布时间:2020-12-16 09:31:15 所属栏目:百科 来源:网络整理
导读:我正在使用gnu Make 3.82并且有一个恼人的问题. 我有一个规则设置目录之间的依赖关系. OBJDIR=../obj$(objdir)/%.o: %.C $(COMPILE) -MM -MT$(objdir)/$(notdir $@) $ -o $(DEPDIR)/$(notdir $(basename $).d )$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $
我正在使用gnu Make 3.82并且有一个恼人的问题.

我有一个规则设置目录之间的依赖关系.

OBJDIR=../obj

$(objdir)/%.o: %.C
    $(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<

为此,obj目录必须存在.
我想将mkdir目录作为先决条件

$(objdir)/%.o: %.C $(objdir)
    $(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<

$(objdir):
    mkdir $(objdir)

这不起作用,因为它在目录存在时失败然后make停止
我试过shell

if [ ! -d $(objdir) ] ; then  
  mkdir $(objdir)             
fi

但显然我有些不对劲.这样做的最佳方法是什么?

解决方法

一种简单的方法是使用:

mkdir -p ../obj

目录存在时它不会失败.

我通常为此创建一个宏MKPATH:

MKPATH = mkdir -p

然后引用规则中的宏:

$(objdir):
    $(MKPATH) $(objdir)

这样,如果有必要,我可以在不更改makefile的情况下更改行为.

你的shell片段:

if [ ! -d $(objdir) ] ; then
  mkdir $(objdir)
fi

不能像写的那样工作,因为make分别执行每一行.

你可以写(注意添加的分号):

if [ ! -d $(objdir) ] ; then 
  $(MKPATH) $(objdir) ; 
fi

要么:

if [ ! -d $(objdir) ] ; then $(MKPATH) $(objdir); fi

要么:

[ -d $(objdir) ] || $(MKPATH) $(objdir)

请注意,命令行必须整体成功,因此请勿尝试:

[ ! -d $(objdir) ] && $(MKPATH) $(objdir)

如果该目录存在,则第一个替代方法失败,但是shell以非零状态退出,因此失败…并导致构建失败.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读