make中的依赖顺序

时间:2011-12-29 06:43:48

标签: c++ makefile gnu-make

因为据说依赖关系的顺序在makefile中很重要。我想了解如何:

finalObjectFile: x.o main.o y.o
    g++ x.o main.o y.o -o finalObjectFile

main.o: header/x.h source/main.cpp
    g++ -c source/main.cpp

x.o: header/x.h source/x.cpp
    g++ -c source/x.cpp

y.o: source/y.cpp header/x.h
    g++ -c source/y.cpp

在上面的代码中,我交换了头文件x.h的位置:

x.o: header/x.h source/x.cpp
        g++ -c source/x.cpp

y.o: source/y.cpp header/x.h
        g++ -c source/y.cpp

但输出没有生效!

哪种依赖关系实际上很重要?

2 个答案:

答案 0 :(得分:3)

在显示的上下文中,源之前的标头与标头之前的源之间没有显着差异。规则说(例如):

  • x.o必须比header/x.hsource/x.cpp更新。

这两个依赖关系出现在哪个序列中并不重要;如果任一依赖项比x.o更新,则将执行该命令。

订单什么时候重要?这样做有点棘手,但如果您有多个中间文件可以随时生成,则可能是一个因素。如果您执行的某些命令影响多个文件但您没有正确地告诉make所有这些交互,则可能会出现问题。

但是,依赖顺序通常不是问题。

答案 1 :(得分:2)

在真正的make文件中很重要,因为您倾向于使用打包规则。 在规则中,$<将替换为第一个先决条件。因此:

compile = g++ -c $< -o $@

x.o : source/x.cpp header/x.h
    $(compile)

y.o : header/y.h source/y.cpp
    $(compile)

第一条规则将根据需要编译source/x.cpp。第二条规则 将尝试编译header/y.h,这绝对不是什么 想要的。

因为这是一种更为典型(和理性)的写作方式 makefile,你必须尊重秩序,至少在哪些方面 元素排在第一位。

另一种情况可能很重要(但在井中情况不应该如此) write makefile):在很多情况下,make将解析依赖关系 按从左到右的顺序;即给定:

x.o : source/x.cpp header/x1.h header/x2.h
    ...

make将首先检查source/x.cpp是否为最新版本并构建它 如有必要,请对header/x1.hheader/x2.h执行相同操作, 以该顺序。如果您有任何未声明的依赖项,则需要 在header/x1.h之前构建header/x2.h,然后更改它们 订单也会造成问题。然而,这是一个错误 makefile文件;应该明确依赖(例如,带有的规则) header/x1.h : header/x2.h)。因为这个订单不能保证 除此以外;例如,在GNU make的情况下,如果是,则可能违反 您使用-j选项。 header/x.h,然后交换订单可能会导致问题。