我正在尝试创建一个 makefile,它通过 .o 文件自动编译我的 .cpp 文件并将其链接到可执行文件中。我无法工作的是自动(甚至手动)依赖项生成。当我取消注释下面注释的代码时,运行 make build
时没有重新编译任何内容。我得到的只是 make: Nothing to be done for 'build'.
,即使 x.h(或任何 .h 文件)已更改。我一直在尝试从这个问题中学习:Makefile, header dependencies ,尤其是 dmckee 的回答。为什么这个 makefile 不起作用?
说明:我可以编译所有内容,但是当我修改任何头文件时,依赖它的 .cpp 文件不会更新。因此,例如,如果我编译我的整个源代码,然后我更改头文件中的 #define
,然后运行 make build
,我得到 Nothing to为“构建”完成。
(当我取消注释以下代码的任一注释 block 时)。
CC=gcc
CFLAGS=-O2 -Wall
LDFLAGS=-lSDL -lstdc++
SOURCES=$(wildcard *.cpp)
OBJECTS=$(patsubst %.cpp, obj/%.o,$(SOURCES))
TARGET=bin/test.bin
# Nothing happens when i uncomment the following. (automated attempt)
#depend: .depend
#
#.depend: $(SOURCES)
# rm -f ./.depend
# $(CC) $(CFLAGS) -MM $^ >> ./.depend;
#
#include .depend
# And nothing happens when i uncomment the following. x.cpp and x.h are files in my project. (manual attempt)
#x.o: x.cpp x.h
clean:
rm -f $(TARGET)
rm -f $(OBJECTS)
run: build
./$(TARGET)
build: $(TARGET)
$(TARGET): $(OBJECTS)
@mkdir -p $(@D)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
obj/%.o: %.cpp
@mkdir -p $(@D)
$(CC) -c $(CFLAGS) $< -o $@
最佳答案
这可能需要几次迭代。
1) 我无法通过您的第一种方法重现您的结果(而且您一定比“什么都没发生”更清楚——Make 实际上没有产生任何输出吗?)。这:
depend: .depend
.depend: $(SOURCES)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ >> ./.depend;
include .depend
似乎按预期工作。我建议您尝试 $(info sources: $(SOURCES))
来验证该变量是否包含您认为它包含的文件名。
2) 我无法通过您的第二种方法重现您的结果(而且您一定比“什么都没发生”更清楚——Make 实际上没有产生任何输出吗?)。当第一种方法被注释掉时,您尝试了 x.o: x.cpp x.h
,对吗?
编辑:
让我们专注于 x.o
。它是否包含#include "x.h"
?当您取消注释第一部分和 make x.o
时,Make 会生成(或修改).depend
吗? .depend
中是否有一行与 x.o
相关,如果有,那是什么?如果然后修改 x.h
,然后修改 make x.o
,Make 会做什么?
关于c++ - Makefile - 依赖生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11369383/