我知道我可以使用自动变量 $@
从 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/