【问题标题】:Need to run make twice after make cleanmake clean 后需要运行两次 make
【发布时间】:2020-05-08 17:23:55
【问题描述】:

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

所以我首先运行 make clean,然后运行 ​​make,它会抛出一个错误,提示找不到 -o 文件。但是当 iIrun 再次运行 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 clean 之后运行两次。

【问题讨论】:

  • 在过去的 48 小时内,您已经三次忽略了有效的简单解决方案,而追求更复杂但无效的解决方案。我可以给你一个解决这个问题的方法,但是如果你不锻炼一些耐心,你会遇到另一个问题。
  • @beta 是的,我正在尝试编写过去 2 天的 makefile。如果您能指出当前 make 文件中的问题,那就太好了。

标签: makefile build gnu-make


【解决方案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

【讨论】:

  • 非常感谢,vpath 解决方案很有效,我想出了一些丑陋的解决方案,就像你在没有 vpath 的情况下展示的那样,它们似乎只是工作,但反而让我遇到了新问题。虽然我已经了解了一些有关 make 文件的知识,但您的解决方案现在让我对 makefile 有了新的认识。非常感谢!
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多