gpt4 book ai didi

makefile - 如何仅使用一个 makefile 在子目录中生成带有源代码的 Makefile

转载 作者:行者123 更新时间:2023-12-01 22:25:25 27 4
gpt4 key购买 nike

我的源代码位于一堆子目录中,例如:

src/widgets/apple.cpp
src/widgets/knob.cpp
src/tests/blend.cpp
src/ui/flash.cpp

在项目的根目录中,我想使用如下规则生成单个 Makefile:

%.o: %.cpp
$(CC) -c $<

build/test.exe: build/widgets/apple.o build/widgets/knob.o build/tests/blend.o src/ui/flash.o
$(LD) build/widgets/apple.o .... build/ui/flash.o -o build/test.exe

当我尝试此操作时,它没有找到 build/widgets/apple.o 的规则。我可以更改一些内容,以便在需要生成 build/widgets/apple.o 时使用 %.o: %.cpp 吗?

最佳答案

原因是你的规则

%.o: %.cpp
...

预计 .cpp 文件与您的建筑物的 .o 位于同一目录中。由于您的情况下的 test.exe 取决于 build/widgets/apple.o (等),因此 make 期望 apple.cpp 为 build/widgets/apple.cpp。

您可以使用 VPATH 来解决此问题:

VPATH = src/widgets

BUILDDIR = build/widgets

$(BUILDDIR)/%.o: %.cpp
...

当尝试构建“build/widgets/apple.o”时,make 将在 VPATH 中搜索 apple.cpp。请注意,构建规则必须使用特殊变量才能访问 make 找到的实际文件名:

$(BUILDDIR)/%.o: %.cpp
$(CC) $< -o $@

其中“$<”扩展为 make 位于第一个依赖项的路径。

另请注意,这将构建 build/widgets 中的所有 .o 文件。如果您想在不同的目录中构建二进制文件,您可以执行类似的操作

build/widgets/%.o: %.cpp
....

build/ui/%.o: %.cpp
....

build/tests/%.o: %.cpp
....

我建议您使用“canned command sequences ”以避免重复实际的编译器构建规则:

define cc-command
$(CC) $(CFLAGS) $< -o $@
endef

然后您可以有多个规则,如下所示:

build1/foo.o build1/bar.o: %.o: %.cpp
$(cc-command)

build2/frotz.o build2/fie.o: %.o: %.cpp
$(cc-command)

关于makefile - 如何仅使用一个 makefile 在子目录中生成带有源代码的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/231229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com