如何在make中管理c文件的依赖关系

卡里姆

我从make开始,我在搜索如何自动为我的c文件生成依赖项,我发现了这段代码:

# pull in dependency info for *existing* .o files
-include $(OBJS:.o=.d)


# compile and generate dependency info
%.o: %.c
    gcc -c $(CFLAGS) $*.c -o $*.o
    gcc -MM $(CFLAGS) $*.c > $*.d

我不明白的是,当我生成依赖文件%.d时,我已经构建了%.o文件,因此创建此依赖文件的意义是什么,并且-include我在所有内容之前执行,所以没有依赖文件将存在。

温特穆特

-include 表示包括该dep文件(如果存在),但如果不存在则不失败。

这个技巧(在make依赖项跟踪中很常见)是,您的依赖项实际上是一个过时的构建。如果有的话,您将包括上次构建的依赖文件。

这不是问题,因为要更改依赖项,必须在上一次构建期间对目标依赖项进行更改-因此,即使make不知道全新的依赖项,它也知道必须重新构建依赖项。目标(并在此过程中生成一个新的依赖文件)。

附录:顺便说一句,gcc和clang有一个-MD选项,可以在构建时生成依赖文件.o(默认情况下带有.d后缀)。这意味着您可以使用隐式规则进行自动依赖项跟踪,并将Makefile减少到最低限度,如下所示(对于.c在平面目录中具有文件的简单项目):

#!/usr/bin/make -f

# name of the binary to build
TARGET   = target

CC       = gcc

# These flags are used by the implicit rules for C preprocessor flags,
# C compiler flags, linker flags, and libraries to link (-lfoo options)
# -MD in CPPFLAGS means that the implicit rules for .o files will also
# generate a corresponding .d file that contains the dependencies.
# The values here are just examples (thank you, Rear Admiral Obvious!)
CPPFLAGS = -MD -I somewhere/include
CFLAGS   = -O2 -g
LDFLAGS  = -L somewhere/lib
LDLIBS   = -lsomelibrary

# SRCS is a list of all .c files in the directory, the other two are
# pattern substitution expressions that take SRCS and replace the .c with .o
# and .d, respectively
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
DEPS = $(OBJS:.o=.d)

all: $(TARGET)

$(TARGET): $(OBJS)

# Look, Ma, no explicit rules for .o files!

clean:
    rm -f $(TARGET) $(OBJS)

.PHONY: all clean

# include dep files (if available).
-include $(DEPS)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Clojure中管理前端库依赖关系?

来自分类Dev

C / C ++ Makefile:如何在.c文件与其他目录中的目标文件之间建立依赖关系?

来自分类Dev

如何在C ++中管理并行,依赖继承?

来自分类Dev

如何在Kbuild中添加对生成的源文件的依赖关系?

来自分类Dev

如何在SBT的.scala文件中使用外部依赖关系?

来自分类Dev

如何在SBT的.scala文件中使用外部依赖关系?

来自分类Dev

如何在ctypes库python中获取我的C#dll的依赖关系?

来自分类Dev

如何在开发中的Julia包中更新依赖关系

来自分类Dev

如何管理常见的Lisp依赖关系?

来自分类Dev

如何避免go.mod文件中的间接依赖关系

来自分类Dev

如何在Play 2.5中激活循环依赖关系?

来自分类Dev

如何在SetupTools中配置SVN依赖关系链接

来自分类Dev

如何在project.json中声明开发依赖关系?

来自分类常见问题

如何在Android Studio中显示依赖关系树?

来自分类Dev

如何在3层架构中组织依赖关系

来自分类Dev

如何在Eclipse中为Gradle依赖关系附加Javadocs?

来自分类Dev

如何在Gradle中迭代项目的依赖关系

来自分类Dev

CMake如何在QtCreator中处理对象依赖关系(.od)

来自分类Dev

如何在RubyOnRails中设置模型之间的依赖关系

来自分类Dev

如何在Eciplse中设置Android L的RecyclerView的依赖关系?

来自分类Dev

如何在sbt 13中表达任务依赖关系

来自分类Dev

CMake如何在QtCreator中处理对象依赖关系(.od)

来自分类Dev

如何管理网站中的文件依赖性

来自分类Dev

如何在Clojure中管理前端库依赖项?

来自分类Dev

如何在Maven中管理编译时间依赖性

来自分类Dev

如何在nuget库中管理Castle Windsor依赖项

来自分类Dev

如何在Thunar中启用文件管理

来自分类Dev

Maven:依赖关系管理

来自分类Dev

如何在没有外部依赖关系的情况下在Python中实现类似C的unsigned int 32?

Related 相关文章

  1. 1

    如何在Clojure中管理前端库依赖关系?

  2. 2

    C / C ++ Makefile:如何在.c文件与其他目录中的目标文件之间建立依赖关系?

  3. 3

    如何在C ++中管理并行,依赖继承?

  4. 4

    如何在Kbuild中添加对生成的源文件的依赖关系?

  5. 5

    如何在SBT的.scala文件中使用外部依赖关系?

  6. 6

    如何在SBT的.scala文件中使用外部依赖关系?

  7. 7

    如何在ctypes库python中获取我的C#dll的依赖关系?

  8. 8

    如何在开发中的Julia包中更新依赖关系

  9. 9

    如何管理常见的Lisp依赖关系?

  10. 10

    如何避免go.mod文件中的间接依赖关系

  11. 11

    如何在Play 2.5中激活循环依赖关系?

  12. 12

    如何在SetupTools中配置SVN依赖关系链接

  13. 13

    如何在project.json中声明开发依赖关系?

  14. 14

    如何在Android Studio中显示依赖关系树?

  15. 15

    如何在3层架构中组织依赖关系

  16. 16

    如何在Eclipse中为Gradle依赖关系附加Javadocs?

  17. 17

    如何在Gradle中迭代项目的依赖关系

  18. 18

    CMake如何在QtCreator中处理对象依赖关系(.od)

  19. 19

    如何在RubyOnRails中设置模型之间的依赖关系

  20. 20

    如何在Eciplse中设置Android L的RecyclerView的依赖关系?

  21. 21

    如何在sbt 13中表达任务依赖关系

  22. 22

    CMake如何在QtCreator中处理对象依赖关系(.od)

  23. 23

    如何管理网站中的文件依赖性

  24. 24

    如何在Clojure中管理前端库依赖项?

  25. 25

    如何在Maven中管理编译时间依赖性

  26. 26

    如何在nuget库中管理Castle Windsor依赖项

  27. 27

    如何在Thunar中启用文件管理

  28. 28

    Maven:依赖关系管理

  29. 29

    如何在没有外部依赖关系的情况下在Python中实现类似C的unsigned int 32?

热门标签

归档