0

我正在尝试创建一个生成文件,该文件可以通过 .o 文件自动编译并将我的 .cpp 文件链接到可执行文件中。我无法工作的是自动(甚至手动)依赖生成。当我取消注释下面的注释代码时,运行时不会重新编译任何内容make build。我得到的只是make: Nothing to be done for 'build'.,即使 xh(或任何 .h 文件)已更改。我一直在尝试从这个问题中学习:Makefile, header dependencies , dmckee's answer, 特别是。为什么这个makefile不起作用?

澄清:我可以编译所有东西,但是当我修改任何头文件时,依赖它的 .cpp 文件不会更新。因此,如果我例如编译我的整个源代码,那么我#define在头文件中更改 a ,然后运行make build​​,然后我得到Nothing to be done for 'build'.(当我取消注释以下代码的任一注释块时)。

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 $@
4

2 回答 2

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时,Make 是否会产生(或修改).depend?是否有与 相关的线.dependx.o如果有,那是什么?如果然后修改x.hand then make x.o,Make 会做什么?

于 2012-07-06T23:10:03.590 回答
1

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

这就是makepp的用武之地。自动检测依赖关系。它不仅会在任何类型的依赖保证这一点时重建目标。它甚至将所有内容链接在一起,并自下而上构建所需的内容。即,如果您的链接器有一个-lmystuff选项,并且您有构建 libmystuff.so 或 .a 的规则,这就是它所需要的,它将及时构建。同样,您可以包含甚至还不存在的文件——这在您的解决方案中是不可能的。

于 2012-07-08T15:12:39.430 回答