makefile - 使用动态目标名称进行制作

标签 makefile gnu-make

我知道我可以使用自动变量 $@从 makefile 的目标中检索当前目标的名称。现在我想知道是否可以有一个如下所示的 makefile:...

$@:
    g++ $@ && ./a.out

这个想法是输入 make test.cpp应该运行g++ test.cpp && ./a.out其中make main.cpp应该运行g++ main.cpp && ./a.out .

我发现通配符可能与我的问题密切相关。然而,像这样的 makefile:

*.cpp:
    g++ $@ && ./a.out

确实创建了适当的目标,但运行 make test.cpp使用这样的 makefile 会产生 make: >>test.cpp<< is already up-to-date - 没有进行编译。

最佳答案

您所描述的行为是您希望 make 系统获得的行为,这就是为什么它如此受许多人喜爱并且扩展性如此良好的原因。

make test.cpp 不起作用,因为您想要的是 make a.out

尝试从简单但正确的 makefile 开始并根据您的需求进行改进

要触发编译,请删除 test.o 并说 make test.o,或者说 touch test.cpp,然后再次make test.o。如果您不需要中间对象文件(我告诉您 - 您确实需要它们),您可以应用上述建议,将 test.o 替换为 a.out

您正在尝试您应该的地方:-)

正如 @MadScientist 在他的评论中提醒的那样,GNU Make 的一个有用功能是一组大量的默认规则,当您不需要精细控制每个步骤时,这些规则可能会节省大量样板文件。

关于makefile - 使用动态目标名称进行制作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21585080/

相关文章:

ubuntu - 我需要 FDK-AAC 的 Makefile

makefile - 为什么/何时需要 'clean' 目标?

c++ - "clean"规则在 Makefile 中不存在,但无论如何 make clean 都会产生一些东西

path - GNU Make 将空格转换为冒号

makefile - 依赖符号 "|"

linux - 如何在 Makefile 中捕获退出 (ctrl+c) 信号?

go - 需要与Makefile一起使用多个Go版本

makefile - 模式规则取决于另一个模式规则

typescript - Makefile 编译所有 tsc 而不管更改

c++ - 更新旧版 C makefile 以包含 C++ 源文件