Makefile 清洁后需要运行make两次

Makefile 清洁后需要运行make两次,makefile,build,gnu-make,Makefile,Build,Gnu Make,我所要做的就是将来自不同源目录的源文件收集到一个文件夹中,然后构建这些make文件。在makeclean之后,我必须运行make命令两次来进行构建 所以首先我运行makeclean,然后运行make,它抛出一个错误,表示找不到-o文件。但是,当我再次运行make时,构建将完成并生成构建文件 我的makefile如下所示 .PHONY: dirs all clean all: dirs $(OBJ_DIR) $(OBJ_FILES) "$(CC) -rvn fLib.a $(OBJ_

我所要做的就是将来自不同源目录的源文件收集到一个文件夹中,然后构建这些make文件。在makeclean之后,我必须运行make命令两次来进行构建

所以首先我运行makeclean,然后运行make,它抛出一个错误,表示找不到-o文件。但是,当我再次运行make时,构建将完成并生成构建文件

我的makefile如下所示

.PHONY:  dirs all clean

all: dirs $(OBJ_DIR) $(OBJ_FILES) 
    "$(CC) -rvn fLib.a $(OBJ_FILES)

# clean build target. Remove all files without reporting errors in case they don't exist.
clean:
    @rm -rf fLib.a $(OBJ_DIR)

# Build target for creating flat header file folder for SharedTrackerAPI (FLAT_INC_DIR) 
# due to too long paths in Windows 7 build
dirs:
    @echo 'Making flat source and header folders.'
    @mkdir -p $(OBJ_DIR)
    @for f in $(SRC_FILES); do cp $$f $(OBJ_DIR); done
    @mkdir -p $(FLAT_INC_DIR) 
    @OLD_CWD=$(CURDIR)
    @cd $(FLAT_INC_DIR)
    @find  $(STA_RADAR_TRACKER_IFACE) -name '*.h' | xargs -i  cp -l {} $(FLAT_INC_DIR)
    @cd $(OLD_CWD)

$(OBJ_DIR)/%.o: $(OBJ_DIR)/%.cpp
    "$(TASKING_CTC_BIN)"/cctc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 
.PHONY:dirs都是干净的
全部:dirs$(OBJ_DIR)$(OBJ_文件)
“$(CC)-rvn fLib.a$(OBJ_文件)
#清除生成目标。如果不存在错误,请删除所有文件而不报告错误。
清洁:
@rm-rf飞行文件a$(OBJ_DIR)
#为SharedTrackRapi(flat_INC_DIR)创建平面头文件文件夹的生成目标
#由于Windows 7版本中的路径太长
目录:
@echo“制作平面源文件夹和标题文件夹”
@mkdir-p$(OBJ_DIR)
@对于$(SRC_文件)中的f;执行cp$$f$(OBJ_DIR);完成
@mkdir-p$(平面公司)
@OLD_CWD=$(CURDIR)
@cd$(平面公司)
@查找$(STA_雷达_跟踪器_IFACE)-名称'*.h'| xargs-i cp-l{}$(FLAT_INC_DIR)
@cd$(旧CWD)
$(OBJ_DIR)/%.o:$(OBJ_DIR)/%.cpp
“$(TASKING_CTC_BIN)”/cctc.exe$(cxflags)-c-o$@$<$(CC_INCLUDE_PATH)

我做错了什么,在执行make clean之后我必须运行make两次。

问题是,尽管
dirs
会将源文件放在平面源目录中,make却不知道。在执行
dirs
规则之前,它已经确定它不知道如何构建目标文件

快速而肮脏的解决方案是告诉Make“相信我,一切都会好起来的”;一种方法是修改对象规则,如下所示:

$(OBJ_DIR)/%.o:
    "$(TASKING_CTC_BIN)"/cctc.exe $(CXXFLAGS) -c -o $@ $(OBJ_DIR)/$*.cpp $(CC_INCLUDE_PATH)
如果你停在那里,你将有一个有效的解决方案

如果您想要一个更干净、高效和灵活的makefile,您必须重新考虑查找源文件的方法。我认为没有充分的理由使用平面源文件方法,但如果您确实想使用它,以下是一个好方法:

vpath %.cpp $(dir $(SRC_FILES))

$(OBJ_DIR)/%.cpp: %.cpp
    @cp $< $@

如何处理头文件(
FLAT\u INC\u DIR
)由您决定,但我再次推荐
vpath

问题是,尽管
dirs
将把源文件放在平面源目录中,Make并不知道。在执行
dirs
规则之前,它已经确定它不知道如何构建目标文件

快速而肮脏的解决方案是告诉Make“相信我,一切都会好起来的”;一种方法是修改对象规则,如下所示:

$(OBJ_DIR)/%.o:
    "$(TASKING_CTC_BIN)"/cctc.exe $(CXXFLAGS) -c -o $@ $(OBJ_DIR)/$*.cpp $(CC_INCLUDE_PATH)
如果你停在那里,你将有一个有效的解决方案

如果您想要一个更干净、高效和灵活的makefile,您必须重新考虑查找源文件的方法。我认为没有充分的理由使用平面源文件方法,但如果您确实想使用它,以下是一个好方法:

vpath %.cpp $(dir $(SRC_FILES))

$(OBJ_DIR)/%.cpp: %.cpp
    @cp $< $@

如何处理头文件(
FLAT\u INC\u DIR
)由您决定,但我再次推荐
vpath

在过去48小时内,您已经三次跳过了简单的解决方案,这些解决方案有效,而追求的是更复杂的解决方案无效。我可以为您提供此问题的解决方案,但如果您不锻炼一些耐心,您将遇到另一个问题。@beta是的,我正在尝试扭转te过去2天的makefiles。如果你能指出当前make文件中的错误,那就太好了。在过去48小时内,你已经三次忽略了简单的解决方案,而追求的是更复杂的解决方案却不起作用。我可以给你这个问题的解决方案,但如果你不这样做,你会遇到另一个问题“我没有耐心。@beta是的,我正在尝试编写过去两天的make文件。如果您能指出当前make文件中的错误,那就太好了。非常感谢,vpath解决方案发挥了巨大的作用,我想出了一些丑陋的解决方案,就像您在没有vpath的情况下展示的那些解决方案一样,它们似乎只起作用,但却让我大吃一惊。”k进入新问题。虽然我已经了解了一些关于生成文件的知识,但您的解决方案现在给了我一个新的角度来看待生成文件。非常感谢Hanks,vpath解决方案非常有魅力,我想出了一些丑陋的解决方案,就像您在没有vpath的情况下展示的那些解决方案一样,它们似乎只起作用,但却让我陷入了新的问题虽然我已经了解了一些关于制作文件的知识,但是你的解决方案现在给了我一个新的角度来看待制作文件。非常感谢