因为据说依赖关系的顺序在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
但输出没有生效!
哪种依赖关系实际上很重要?
答案 0 :(得分:3)
在显示的上下文中,源之前的标头与标头之前的源之间没有显着差异。规则说(例如):
x.o
必须比header/x.h
和source/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.h
和header/x2.h
执行相同操作,
以该顺序。如果您有任何未声明的依赖项,则需要
在header/x1.h
之前构建header/x2.h
,然后更改它们
订单也会造成问题。然而,这是一个错误
makefile文件;应该明确依赖(例如,带有的规则)
header/x1.h : header/x2.h
)。因为这个订单不能保证
除此以外;例如,在GNU make的情况下,如果是,则可能违反
您使用-j
选项。
header/x.h
,然后交换订单可能会导致问题。