繁体   English   中英

Makefile-依赖项生成

[英]Makefile - Dependency generation

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

澄清:我可以编译所有内容,但是当我修改任何头文件时,依赖于它的.cpp文件不会被更新。 因此,例如,如果我编译了整个源代码,那么我在头文件中更改了#define ,然后运行make build ,那么Nothing to be done for '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 $@

这可能需要几次迭代。

1)我无法从您的第一种方法中再现您的结果(并且您必须比“什么都没有发生”更清楚-Make实际上没有产生输出吗?)。 这个:

depend: .depend

.depend: $(SOURCES)
    rm -f ./.depend
    $(CC) $(CFLAGS) -MM $^ >> ./.depend;

include .depend

似乎按预期工作。 我建议您尝试$(info sources: $(SOURCES))来验证该变量是否包含您认为确实包含的文件名。

2)我无法从第二种方法重现您的结果(而且您必须比“什么都没有发生”更清楚-Make实际上没有产生任何输出吗?)。 您尝试了xo: x.cpp xh当第一种方法被注释掉时, xo: x.cpp xh是吗?

编辑:
让我们专注于xo 它包含#include "xh"吗? 当您取消注释第一部分并make xo ,Make是否会产生(或修改) .depend .depend中是否存在与xo相关的行,如果是,那是什么? 如果然后修改xh然后make xo ,Make会做什么?

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

这就是makepp的用处 。依赖关系会自动检测到。 只要有任何依赖关系,它不仅会重建目标。 它甚至将所有内容链接在一起,并自下而上构建所需的内容。 也就是说,如果您的链接器具有-lmystuff选项,并且您具有构建libmystuff.so或.a的规则,仅此而已,它将及时构建。 同样,您可以包含尚不存在的文件-解决方案无法实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM