生成文件模式%o:%.c

生成文件模式%o:%.c,c,makefile,C,Makefile,我有两个文件a.c和b.c在一个更大的项目。我决定移动源文件,只添加对象文件a.o和b.o 如果生成文件具有规则%.o:%.c,则在生成文件中添加a.o和b.o 我期待着投诉a.c.和b.c.没有找到 但是它编译时没有任何错误如果make想要构建一个像xyz.o这样的文件,并且该目标没有明确的规则,那么它将查看隐式模式和后缀规则来尝试找到一个规则。如果有一个规则与目标匹配,并且make知道如何构建所有先决条件,那么该规则将匹配,make将尝试使用它 如果make无法构建一个或多个先决条件,则该隐

我有两个文件a.c和b.c在一个更大的项目。我决定移动源文件,只添加对象文件a.o和b.o

如果生成文件具有规则%.o:%.c,则在生成文件中添加a.o和b.o

我期待着投诉a.c.和b.c.没有找到


但是它编译时没有任何错误

如果make想要构建一个像xyz.o这样的文件,并且该目标没有明确的规则,那么它将查看隐式模式和后缀规则来尝试找到一个规则。如果有一个规则与目标匹配,并且make知道如何构建所有先决条件,那么该规则将匹配,make将尝试使用它

如果make无法构建一个或多个先决条件,则该隐式规则不匹配,make将继续查找其他隐式规则。这不是一个错误!在特定的对象文件中,make有内置的规则,知道如何从C源文件、C++源文件、FORTRAN源文件、汇编文件等中构建.O。它们都有%.O的目标模式,但通常只有一个匹配。其他的都被扔掉了,但这不是一个错误

如果在隐式规则搜索结束时,没有任何规则与目标匹配,但目标存在,那么就没有问题:make假设此文件是一个源文件,如xyz.c或xyz.h,不应该生成,只需使用它即可


如果在搜索所有规则后没有找到匹配项,并且目标文件xyz.o不存在,则您出现错误,make将报告它不知道如何构建该目标。

我不太理解您在这里提出的问题,但如果make需要查找文件,则任何文件,包括a.o,以及该文件都已存在,并且您没有在makefile中定义任何先决条件,那么make不会抱怨,因为该文件已经存在。先决条件不存在且无法找到的模式规则不是错误:它只是意味着模式规则不匹配。有很多模式规则可以构建一个文件a.o;他们中最多有一个会匹配。如果它们都不匹配也没关系。谢谢你的回复。很抱歉我的帖子很混乱。我对制作文件很陌生。根据这个模式%.o:%.c,我的理解是,如果让文件看到一个xyz.o,它将尝试从xyz.c编译它。我错了吗?