2012-07-06 183 views
0

我正在尝试创建一个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] 

回答

2

这可能需要几次迭代。

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时,是否生产(或修改).depend.depend中是否有与x.o有关的行,如果有的话是什么?如果您然后修改x.h然后make x.o,Make会做什么?

+0

我运行了'$(info sources:$(SOURCES))',我的源代码是我认为它们的,那就是所有.cpp文件,而不是头文件。我想头文件不应该包含源文件,因为它们只能在从#include指令调用时编译。另外,我试图澄清我的问题,告诉我是否需要进一步澄清。 – nijoakim 2012-07-07 09:24:44

+0

我按照以下教程解决了这个问题:http://scottmcpeak.com/autodepend/autodepend.html。我将?obj /%。o:%.cpp'-规则更改为本教程中所述的内容。我的问题是依赖文件没有包含整个路径,但错过了“obj /”。感谢所有的帮助!你最近的编辑让我发现了问题! :D – nijoakim 2012-07-10 18:29:13

1

您只用$(CC) -MM解决一种依赖关系。还有其他各种变化的命令选项(例如-DDO_SOMETHING_ELSE),或库导出的一组不同的符号。传统使得为调试不一致的可执行文件提供了许多乐趣!

这就是makepp的地方。自动检测依赖关系。它不仅在任何类型的依赖性保证这一点时重建目标。它甚至把所有东西都联系在一起,并从底层构建需要的东西。即如果您的链接器有-lmystuff选项,并且您有构建libmystuff.so或.a的规则,只需要这些,它就会及时生成。同样,您可以添加一些甚至不存在的文件 - 解决方案不可能。

+0

谢谢,但我更喜欢定期制作。:) – nijoakim 2012-07-10 19:04:57