当前位置:  开发笔记 > 编程语言 > 正文

为不同的输出目录生成gcc依赖项

如何解决《为不同的输出目录生成gcc依赖项》经验,为你挑选了3个好方法。

我正在使用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吓坏.



1> Don McCaughe..:

我假设你正在使用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 4.1.2,gmake 3.8.1,如果头文件不存在,配方'$(CC)$(CCFLAGS)-MF"$ @" - MG -MM -MP -MT"$ @" -MT"$(<:.c = .o)""$ <"'无限循环.//删除-MP选项会停止无限循环.

2> bk1e..:

答案在GCC手册中:使用-MT标志.

-MT target

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

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

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

$(objpfx)foo.o: foo.c


@checksum:...不是[2.9.5](http://gcc.gnu.org/gcc-2.95/)发布> 14年前?

3> Steve Pitche..:

你可能会喜欢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.


顺便说一句,一定要避免将"包含"放在第一个目标之上.将它放在Makefile的底部是合乎逻辑的,因为它总是传递依赖关系的地方,当它们必须手工制作时!
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有