Gcc GNU做出意想不到的行为

Gcc GNU做出意想不到的行为,gcc,makefile,gnu-make,Gcc,Makefile,Gnu Make,我希望make在目录中生成所有.cpp,并跟踪标题更改。我尝试这样做,首先使用-MM选项使gcc输出具有依赖项的目标,然后将主体附加到实际调用编译的目标: OPTIONS = -std=c++11 -Wall export all : $(patsubst %.cpp, %.o, $(wildcard *.cpp)) %.o : %.mkt make -f $*.mkt %.mkt : %.cpp gcc $(OPTIONS) -MM $*.cpp > $&

我希望
make
在目录中生成所有
.cpp
,并跟踪标题更改。我尝试这样做,首先使用
-MM
选项使gcc输出具有依赖项的目标,然后将主体附加到实际调用编译的目标:

OPTIONS = -std=c++11 -Wall

export

all : $(patsubst %.cpp, %.o, $(wildcard *.cpp))


%.o : %.mkt
    make -f $*.mkt

%.mkt : %.cpp
    gcc $(OPTIONS) -MM $*.cpp > $&.mkt1
    echo gcc $(OPTIONS) -c %.cpp > $*.mkt2
    cat $*.mkt1 $*.mkt2 > $*.mkt
然而不知何故,这个脚本发出了表单的调用

g++ -c -o something.o something.cpp

对于目录中的每个
.cpp
文件。不会创建临时文件
.mkt1
.mkt2
.mkt
。为什么会发生这种情况?我如何达到期望的行为?我使用mingw在windows上执行此操作。

您提供了一系列两种模式规则(
%.cpp
->
%.mkt
%.mkt
->
%.o
),但Make已经有一个隐式规则(
%.cpp
->
%.o
),在搜索构建
某物的方法时,它会首先找到该规则


解决此问题的最简单方法是使用
make-r
(或
make--no-builtin rules
),这将禁用内置隐式规则。

patsubst
调用中去掉逗号后的空格是否有帮助,如果要将
mkt
文件用作makefile,那么这些文件不应该有缩进选项卡吗?@tripleee删除空格无效
.mkt
文件确实应该有选项卡,我的错,但在这里它们甚至没有被创建。。不要认为这是正确的答案。@MaximYegorushkin,用户定义的规则会覆盖内置规则。但是OP没有为
%.o:%.cpp
定义规则。当Make查找生成
something.o
的方法时,它会查找内置规则(没有用户定义的规则),并且不会进一步查找。如果禁用了内置规则,Make将进一步查找,找到链并使用它。我已经用GNU Make 3.81对此进行了测试,但如果您能证明我错了,我将不胜感激。
-MM
标志导致gcc以
x.o:x.cpp
的形式生成行。我猜作者的意图是将一个配方附加到这样的依赖项中,但他在
%.mkt
配方的第二行中遗漏了一个选项卡。@MaximYegorushkin,这是真的,这不是该命令中唯一的问题,但除非/直到OP可以执行
%.mkt
配方,否则这是一个没有意义的点。不依赖命令行选项实现这一点的另一种方法是在Makefile中的某个位置添加
。后缀:
。不过,这可能有点过于激烈,这取决于makefile的其余部分。