我正在使用gcc生成依赖文件,但我的构建规则将输出放入子目录.有没有办法告诉gcc将我的子目录前缀放在它为我生成的依赖文件中?
gcc $(INCLUDES) -E -MM $(CFLAGS) $(SRC) >>$(DEP)
Don McCaughe.. 40
我假设你正在使用GNU Make和GCC.首先添加一个变量来保存依赖项文件列表.假设您已经有一个列出我们所有来源的:
SRCS = \ main.c \ foo.c \ stuff/bar.c DEPS = $(SRCS:.c=.d)
然后在makefile中包含生成的依赖项:
include $(DEPS)
然后添加此模式规则:
# automatically generate dependency rules %.d : %.c $(CC) $(CCFLAGS) -MF"$@" -MG -MM -MP -MT"$@" -MT"$(<:.c=.o)" "$<" # -MF write the generated dependency rule to a file # -MG assume missing headers will be generated and don't stop with an error # -MM generate dependency rule for prerequisite, skipping system headers # -MP add phony target for each header to prevent errors when header is missing # -MT add a target to the generated dependency
"$ @"是目标(在左侧的东西:),"$ <"是先决条件(在右侧的东西:).表达式"$(<:.c = .o)"用.o替换.c扩展名.
这里的技巧是通过添加-MT两次来生成具有两个目标的规则; 这使得.o文件和.d文件都依赖于源文件及其头文件; 这样,只要更改了任何相应的.c或.h文件,依赖文件就会自动重新生成.
如果缺少头文件,-MG和-MP选项会使make吓坏.
我假设你正在使用GNU Make和GCC.首先添加一个变量来保存依赖项文件列表.假设您已经有一个列出我们所有来源的:
SRCS = \ main.c \ foo.c \ stuff/bar.c DEPS = $(SRCS:.c=.d)
然后在makefile中包含生成的依赖项:
include $(DEPS)
然后添加此模式规则:
# automatically generate dependency rules %.d : %.c $(CC) $(CCFLAGS) -MF"$@" -MG -MM -MP -MT"$@" -MT"$(<:.c=.o)" "$<" # -MF write the generated dependency rule to a file # -MG assume missing headers will be generated and don't stop with an error # -MM generate dependency rule for prerequisite, skipping system headers # -MP add phony target for each header to prevent errors when header is missing # -MT add a target to the generated dependency
"$ @"是目标(在左侧的东西:),"$ <"是先决条件(在右侧的东西:).表达式"$(<:.c = .o)"用.o替换.c扩展名.
这里的技巧是通过添加-MT两次来生成具有两个目标的规则; 这使得.o文件和.d文件都依赖于源文件及其头文件; 这样,只要更改了任何相应的.c或.h文件,依赖文件就会自动重新生成.
如果缺少头文件,-MG和-MP选项会使make吓坏.
答案在GCC手册中:使用-MT
标志.
-MT target
更改依赖关系生成所发出的规则的目标.默认情况下,CPP获取主输入文件的名称,删除任何目录组件和任何文件后缀,例如
.c
,并附加平台的常用对象后缀.结果是目标.一个
-MT
选项将设置目标正是你指定的字符串.如果需要多个目标,可以将它们指定为单个参数-MT
,或使用多个-MT
选项.例如,
-MT '$(objpfx)foo.o'
可能会给$(objpfx)foo.o: foo.c
你可能会喜欢Don McCaughey这个简短版本的答案:
SRCS = \ main.c \ foo.c \ stuff/bar.c
DEPS = $(SRCS:.c=.d)
添加-include $(DEPS)
注释-
前缀,如果.d
文件尚不存在,则会使错误无效.
生成依赖项文件不需要单独的模式规则.只需添加-MD
或-MMD
正常编译行,即可.d
在编译源文件的同时生成文件.例如:
%.o: %.c gcc $(INCLUDE) -MMD -c $< -o $@ # -MD can be used to generate a dependency output file as a side-effect of the compilation process.