4

我正在使用gcc来生成我的 Makefile 的依赖项。但它不使用相对路径。例如,

gcc -MM util/test.c ui/resource.c

生成

test.o: util/test.h
resource.o: ui/resource.h

同时,为了让make找到依赖项,它会生成如下内容:

util/test.o: util/test.h
ui/resource.o: ui/resource.h

有没有办法让 gcc 表现得像第二个例子?

4

1 回答 1

5

man gcc

-MT target
更改依赖生成发出的规则的目标。默认情况下,CPP 采用主输入文件的名称,删除任何目录组件和任何文件后缀,例如 .c,并附加平台的常用对象后缀。结果就是目标。

-MT 选项会将目标设置为您指定的字符串。如果需要多个目标,可以将它们指定为 -MT 的单个参数,或使用多个 -MT 选项。

例如, -MT '$(objpfx)foo.o' 可能会给出

$(objpfx)foo.o: foo.c

-MQ目标
与 -MT 相同,但它引用任何对 Make 特殊的字符。-MQ '$(objpfx)foo.o' 给出

$$(objpfx)foo.o: foo.c

默认目标是自动引用的,就好像它是用 -MQ 给出的。

因此,您可以使用例如

gcc -MM -MT util/test.o util/test.c
gcc -MM -MT ui/resource.o ui/resource.c

更新

如果您希望将所有依赖项放在一个文件中,则有多种可能性。

您可以gcc -MM按顺序执行并重定向输出

( gcc -MM -MT util/test.o util/test.c; gcc -MM -MT ui/resource.o ui/resource.c ) >file.deps

您可以使用 sed 或 perl 对输出进行后处理

gcc -MM util/test.c ui/resource.c | perl -p -e 's,^(.+?)\.o: (.+?)/\1\.c.*,$2/$&,;' >file.deps

您可以重定向第一个输出并将以下内容附加到某个文件

gcc -MM -MT util/test.o util/test.c >file.deps
gcc -MM -MT ui/resource.o ui/resource.c >>file.deps
于 2013-01-31T19:15:30.610 回答