我要用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
抱歉,但实际上你似乎无法发布一个包含太多代码的问题而且我不知道写什么来使这篇文章比这更长。
答案 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-objs
和clean-test
。如果你不能拆分它,你就无法绕过子电话(如已经建议的那样)。
我只是想强调解决这个问题的清洁和标准方法。