2013-01-31 33 views
2

我使用gcc来生成我的Makefile的依赖关系。但它不使用相对路径。例如,使gcc -MM输出对象文件名的相对路径

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

产生

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

同时,允许使找到的依赖,它前人的精力产生这样的:

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

有没有什么办法让GCC像第二个例子一样?

回答

4

man gcc

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

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

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

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

-MQ目标
同-MT ,但它会引用任何特殊的字符。 -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 
+0

不好......这样我需要生成一个依赖文件fo r每个源文件。我想从我的所有来源生成一个单独的依赖文件... –

+0

@AndréWagner请参阅最新的答案。 –