Makefile make规则中的编译顺序

Makefile make规则中的编译顺序,makefile,gnu-make,Makefile,Gnu Make,我有一个编译规则如下: $(compiled_objs) : $(obj_dir)/%.o: $(src_base)/%.cpp 它从src_base中的特定.cpp文件创建.o dso对象,工作正常 问题: 我的问题是gnu Makefiles中是否有一种方法可以对%.cpp文件的处理顺序进行排序。例如,在每个src_基中,我都有一个名为xxxLast.cpp的文件,我想在处理完$src_dir目录中的所有其他.cpp文件后,为*Last.cpp创建对象 用例: 我的用例并不常见,但

我有一个编译规则如下:

    $(compiled_objs) : $(obj_dir)/%.o: $(src_base)/%.cpp
它从src_base中的特定.cpp文件创建.o dso对象,工作正常

问题: 我的问题是gnu Makefiles中是否有一种方法可以对%.cpp文件的处理顺序进行排序。例如,在每个src_基中,我都有一个名为xxxLast.cpp的文件,我想在处理完$src_dir目录中的所有其他.cpp文件后,为*Last.cpp创建对象

用例: 我的用例并不常见,但我希望将所有其他.o对象的md5sum嵌入到xxxLast.cpp文件中,以便在规则中添加额外的处理


我没有在makefile上做太多工作。我们将非常感谢您的帮助

在makefile的其他地方,您将有一个依赖于
$(编译的对象)

Make将按照列出的顺序构建任何目标的先决条件。因此,如果您希望最后生成一个特定对象,那么只需将其放在
编译的\u objs
宏的末尾

请注意,在并行构建过程中,make仍将遍历命令以按相同的顺序运行,但由于并行化效果,它们实际上可能以不同的顺序运行,或者至少您不知道最后一个命令将在所有以前的命令完成后启动

对于你的情况,我真的不建议只是在最后一个物体上磕磕绊绊,然后抱着希望。您应该使用make规则明确定义此关系,因此:

all_objects: xxxLast.o

xxxLast.o: $(compiled_objs-but-not-xxxLast.o)
        ...generate md5sums for $^...

xxxLast.o $(compiled_objs-but-not-xxxLast.o): $(obj_dir)/%.o: $(src_base)/%.cpp

谢谢你,科学家。这个解决方案有效。我有一个相关的问题。我可以使用make-W/*.cpp/*.o调用递归make吗?我希望将相应的cpp文件转换为相同的.o文件,但希望递归地使用它。原因是,在某些情况下,我只想根据特定条件调用特定src_dir上的递归规则,其中包含大量源文件。我想重建所有对象。对不起,我不太明白这个问题。如果要重建一组特定的对象文件,可以将它们添加到生成行:
$(make)/foo.o/bar.o/baz.o
如果要始终重建它们,但仅重建对象文件,则必须在每个文件前面添加一个
-W
。您还可以添加
-B
标志,但如果这些对象中的任何一个依赖于生成的文件,则将重新生成它们。这回答了你的问题吗?谢谢。对不起,我没解释清楚。你提到的东西肯定有用,但我的问题没有什么不同。因为我有很多不同的src_目录,每个目录都有N.cpp文件,可以创建N.o文件。我可以使用src_dir进行递归调用,它将重建该特定dir中的所有.cpp文件。
all_objects: xxxLast.o

xxxLast.o: $(compiled_objs-but-not-xxxLast.o)
        ...generate md5sums for $^...

xxxLast.o $(compiled_objs-but-not-xxxLast.o): $(obj_dir)/%.o: $(src_base)/%.cpp