代码之家  ›  专栏  ›  技术社区  ›  Chris Tonkinson

在make中更正自动生成的依赖项(来自gcc)

  •  2
  • Chris Tonkinson  · 技术社区  · 16 年前

    我有以下makefile(片段)

    SRC_DIR     = src
    OBJ_DIR     = obj
    DEP_DIR     = dep
    BIN_DIR     = .
    SRC_FILES  := $(wildcard $(SRC_DIR)/*.cpp)
    OBJ_FILES  := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES))
    DEP_FILES  := $(patsubst $(SRC_DIR)/%.cpp,$(DEP_DIR)/%.d,$(SRC_FILES))
    
    # Development build directive
    dev: $(DEP_FILES) $(OBJ_FILES)
      $(CPPC) $(LIBS) $(FLAGS_DEV) $(OBJ_FILES) -o $(BIN_DIR)/$(PROJECT)
    
    # Object file directives
    $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(DEP_DIR)/%.d
      $(CPPC) -c $(FLAGS_DEV) $< -o $@
    
    # Dependency directives
    $(DEP_DIR)/%.d: $(SRC_DIR)/%.cpp
      $(CPPC) -MM -MD $< -o $@
    
    include $(DEP_FILES)
    

    当我跑的时候 make dev 我看到了以下几点

    makefile:59: dep/area.d: No such file or directory
    makefile:59: dep/avatar.d: No such file or directory
    makefile:59: dep/board.d: No such file or directory
    makefile:59: dep/socket.d: No such file or directory
    g++ -MM -MD src/socket.cpp -o dep/socket.d
    g++ -MM -MD src/board.cpp -o dep/board.d
    g++ -MM -MD src/avatar.cpp -o dep/avatar.d
    g++ -MM -MD src/area.cpp -o dep/area.d
    g++ -c -ggdb3 -ansi -Wall -Werror -pedantic-errors src/area.cpp -o obj/area.o
    g++ -c -ggdb3 -ansi -Wall -Werror -pedantic-errors src/avatar.cpp -o obj/avatar.o
    g++ -c -ggdb3 -ansi -Wall -Werror -pedantic-errors src/board.cpp -o obj/board.o
    g++ -c -ggdb3 -ansi -Wall -Werror -pedantic-errors src/socket.cpp -o obj/socket.o
    g++ -ggdb3 -ansi -Wall -Werror -pedantic-errors obj/area.o obj/avatar.o obj/board.o obj/socket.o  -o ./game
    

    换衣服的时候 src/socket.h make ,我原以为它会重建整个项目,但它只发出一个动作

    g++ -ggdb3 -ansi -Wall -Werror -pedantic-errors obj/area.o obj/avatar.o obj/board.o obj/socket.o  -o ./game
    

    我相信我正确地生成了自动依赖项,所以我感觉我没有正确地使用它们。我哪里出错了?我知道答案 makefile:59:...

    提前感谢;干杯

    1 回复  |  直到 16 年前
        1
  •  2
  •   eswald    16 年前

    *.d 文件没有得到它们的完全依赖关系;它们也依赖于所有的头文件。解决此问题的一种方法是在 %.d

    # Dependency directives
    $(DEP_DIR)/%.d: $(SRC_DIR)/%.cpp
      $(CPPC) -MM -MD $< -o $@
      sed -i 'p;s|$(OBJ_DIR)/\(.*\)\.o:|$(DEP_DIR)/\1.d:|' $@
    

    如果 -i sponge (在 moreutils