【问题标题】:Managing Dependency Complexity in Make Files管理 Make 文件中的依赖复杂性
【发布时间】:2012-09-20 12:30:48
【问题描述】:

我正在开发我的第一个开源 C++ 项目:https://github.com/jehugaleahsa/spider-cpp

我正在管理我自己的 Makefile,我有关于如何管理依赖项的“最佳实践”问题。现在,我使每个 .o 文件依赖于 .cpp 文件中包含的每个头文件。所以:

code.o: code.cpp code.hpp dep1.hpp de2.hpp
    g++ -c code.cpp

首先,我很确定 Make 支持创建目标文件的简写。如果有人能举个例子,我会很感激的。

接下来,有没有办法避免将每个包含的标头列为依赖项?我想确保如果我更改依赖项,这些更改仍然兼容。列出包含的标头既繁琐又容易搞砸。

【问题讨论】:

  • 你可能想改用 CMake;它的语法比 make 更简单(好吧,无论如何,不​​同),而且它是可移植的;它为运行它的平台上最常见的 IDE 生成 makefile 或项目文件。
  • 或预制。 CMake 生成 makefile,但这些 makefile 仍然依赖于 CMake。 premake 可以生成可以作为 makefile 分发的 makefile。无论哪种方式,makefile 都可能变得笨拙,并且是特定于平台/IDE/编译器的(除非您将它们设为“通用”,这更加笨拙)。
  • 看一下 GNU make 手册,很详细。不要被无数的“做替换,这次做对了”的提议所吸引,没有一个获得显着的牵引力。 “足够好,甚至是笨拙”就是“足够好”。

标签: c++ makefile dependencies object-files


【解决方案1】:

操作:

首先,我很确定 Make 支持创建目标文件的简写。如果有人能举个例子,我会很感激的。

来自here

OBJS := foo.o bar.o

#Your program should have the objects as dependencies, and link them
proggie: $(OBJS)
gcc $(OBJS) -o proggie


# compile
%.o: %.c
    gcc -c $(CFLAGS) $*.c -o $*.o

操作:

接下来,有没有办法避免将每个包含的标头都列为依赖项

向下on the same page,看到这些行:

# 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

这基本上是使用 gcc 的 -MM 选项来获取头文件列表,现在我们可以依赖它们了。因此,我们将带有此类头文件列表的文件输出到 .d 文件,然后下一次,我们将文件列表添加为依赖项,这就是 -include 命令所做的。如果依赖项 .d 文件尚不存在,“-”可避免错误。

注意,您应该修改以上内容以考虑.cpp 文件

【讨论】:

    【解决方案2】:

    是的,make 支持创建目标文件的简写。这称为规则。是的,有一种方法可以避免将每个包含的标头列为依赖项。 g++/gcc 有 -MM 选项,它将生成完整的依赖项列表。

    不幸的是,我无法在此处提供有关如何执行此操作的简单说明。您必须阅读文档并使用 make 实用程序。我发现这本书很有帮助:“使用 GNU Make 管理项目”。 GNU 站点上有一个文档,但我发现它有点难以阅读。 www.gnu.org/software/make/manual/make.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2012-12-26
      • 2012-06-30
      • 1970-01-01
      相关资源
      最近更新 更多