清洁后需要运行两次make

问题描述 投票:0回答:1

我想做的就是把不同源码目录下的源码文件收集到一个文件夹中,然后对这些make文件进行编译。在make clean之后,我必须运行两次make命令来进行编译。

所以我先运行make clean,然后运行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) 

我到底做错了什么,以至于在清理完make之后还要运行两次make。

makefile build gnu-make
1个回答
1
投票

问题是,虽然 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 $< $@

现在你可以摆脱 dir 并使用您的未修改对象规则。

$(OBJ_DIR)/%.o: $(OBJ_DIR)/%.cpp
    "$(TASKING_CTC_BIN)"/cctc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 

如何处理头文件(FLAT_INC_DIR)由你决定,但我建议 vpath 再次。

© www.soinside.com 2019 - 2024. All rights reserved.