c++ - Makefile - 依赖生成

标签 c++ makefile header-files

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

相关文章:

makefile - :C colon-C mean in FreeBSD make? 是什么意思

c++ - 无法使用单独的文件夹获取生成文件以使头文件正常工作

c - 非接口(interface)函数原型(prototype)应该放在哪里?

c++ - C++ 头文件如何包含实现?

c - 头文件中const变量的多重定义

c# - System.EntryNotFoundException : Unable to find the entry point in the DLL

c++ - 当主窗口保持在顶部时,子窗口被遮挡 - MacOS

c++ - 使用 Qt C++ 截屏

iphone - 峰值滤波器有咔哒声和爆裂声

compilation - 使用 Gnu Make 实用程序自动创建具有与源不同的构建结构的文件