使用动态目标名称制作

Max*_*rch 5 makefile gnu-make

我知道我可以使用$@makefile 中目标内的自动变量来检索当前目标的名称。现在我想知道是否有可能有一个看起来像这样的 makefile:...

$@:
    g++ $@ && ./a.out
Run Code Online (Sandbox Code Playgroud)

这个想法是打字make test.cpp应该g++ test.cpp && ./a.out在应该运行的地方make main.cpp运行g++ main.cpp && ./a.out

我看到通配符可能与我的问题密切相关。但是,像这样的makefile:

*.cpp:
    g++ $@ && ./a.out
Run Code Online (Sandbox Code Playgroud)

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

bob*_*bah 4

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

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

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

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

你正试图推动你应该拉的地方:-)

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