Makefile在目标上崩溃了

时间:2015-08-21 14:09:07

标签: c++ makefile

我要用make编译一个c ++项目,我不是Makefile上的专家,但看起来没问题,这个Makefile有什么问题:

.PHONY: all test log debug clean cleanall

####### BUILD RULES #####################################################
all:        cleanall
        make debug
        clean
        make test 
        clean
        make log

log: CFLAGS := $(CFLAGS_LOG)

clean:
    rm -f $(OBJS) 

cleanall: clean
    rm -f   $(OUTPATH)$(APPNAME) \
        $(OUTPATH_DBG)$(APPNAME_DBG) \
        $(OUTPATH_DBG)$(APPNAME_LOG)

test: $(OBJS)
    $(CXX) -static $(CFLAGS) -o $(OUTPATH)$(APPNAME) $(OBJS) $(LIB)
    strip $(OUTPATH)$(APPNAME)

log: $(OBJS)
    $(CXX) -static $(CFLAGS_LOG) -o $(OUTPATH)$(APPNAME_LOG) $(OBJS) $(LIB)
    strip $(OUTPATH)$(APPNAME_LOG)

debug: $(OBJS)
    $(CXX) $(CFLAGS_DBG) -o $(OUTPATH_DBG)$(APPNAME_DBG) $(OBJS) $(LIB)

继续崩溃,因为错误:

make[1]: Leaving directory '/blablabla/dcp_edi/test'
clean
make: clean: command not found
Makefile:66: recipe for target 'all' failed
抱歉,但实际上你似乎无法发布一个包含太多代码的问题而且我不知道写什么来使这篇文章比这更长。

2 个答案:

答案 0 :(得分:0)

您的问题出现在这里:

####### BUILD RULES #####################################################
all:        cleanall
        make debug
        clean <<<<<<<<<<<
        make test 
        clean <<<<<<<<<<<
        make log

在规则部分之后放置的所有内容都被make解释为要执行的shell命令。正如评论中所提到的clean不是shell命令,而是makefile中定义的另一个规则。

你可以通过另一个递归调用解决这个问题:

####### BUILD RULES #####################################################
all:        cleanall
        make debug
        make clean
        make test 
        make clean
        make log

答案 1 :(得分:0)

你应该写:

all: cleanall debug clean test clean log

(没有任何其他行)。问题是,清洁不会在这里执行两次。如果不是真的需要,那就消除第一个clean。否则,您可以将clean目标拆分为clean-objsclean-test。如果你不能拆分它,你就无法绕过子电话(如已经建议的那样)。

我只是想强调解决这个问题的清洁和标准方法。