我正在尝试创建一个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 be done for 'build'.
(当我取消注释下面代码的注释块时)。Makefile - 依赖关系生成
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 [email protected]
obj/%.o: %.cpp
@mkdir -p $(@D)
$(CC) -c $(CFLAGS) $< -o [email protected]
我运行了'$(info sources:$(SOURCES))',我的源代码是我认为它们的,那就是所有.cpp文件,而不是头文件。我想头文件不应该包含源文件,因为它们只能在从#include指令调用时编译。另外,我试图澄清我的问题,告诉我是否需要进一步澄清。 – nijoakim 2012-07-07 09:24:44
我按照以下教程解决了这个问题:http://scottmcpeak.com/autodepend/autodepend.html。我将?obj /%。o:%.cpp'-规则更改为本教程中所述的内容。我的问题是依赖文件没有包含整个路径,但错过了“obj /”。感谢所有的帮助!你最近的编辑让我发现了问题! :D – nijoakim 2012-07-10 18:29:13