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的其余部分。