假设我有这个简约的 main.c 程序。
我尝试禁用默认隐式规则,并使用以下设置自己的编译规则:
int main(void)
{
return 0;
}
还有这个Makefile
.PHONY: %.run
%.run: %
./$<
如果我运行以下命令
make main.run
我希望能够从main.c文件中制作可执行文件(使用make
的默认隐式规则%:%.c
)
- 运行main
- 成功退出
但是,我收到了以下错误信息
make: *** No rule to make target 'main.run'. Stop.
我尝试禁用默认隐式规则,并使用以下设置自己的编译规则:
.SUFFIXES:
%: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $<
但这并没有帮助解决问题。
然而,在这两种情况下,如果我先运行make main
,然后再运行make main.run
,它就按预期工作。但运行两个命令正是我想通过我的%.run
规则避免的。
当然,如果我用这个显式规则替换我的模式规则
main.run: main
./main
它正在工作。
另外,如果我将模式规则更改为%.x: %.c
和%.run: %.x
,并使用可执行文件的.x后缀,这也可以工作,但是我不想要后缀。
当然,我的问题不是想知道在一个命令中编译和运行程序的正确方法,而是想知道为什么这个Makefile没有按照我期望的方式执行。
make
会删除main文件,因为它是一个中间文件,但实际上并没有。然而,由于这不是主要问题,我根据你的评论将其从我的初始问题中删除了。我还添加了你要求的显式规则,当然是有效的。 - ovmjmrm main
的后续问题,这发生在%.x
版本中。 - Joseph Quinsey.INTERMEDIATE: main
(至少在GNUMake 3.81中),它可以正常工作。 - Betagmake
,你可以给你的源代码命名为可执行文件的名称(例如,foobar.c
对应可执行文件foobar
),并像这样使用/dev/null
作为 makefile:make -f /dev/null foobar
(完全依赖于隐式规则)。 - bobah