📜  在Makefile中定义规则

📅  最后修改于: 2020-11-01 04:37:12             🧑  作者: Mango


现在,我们将学习Makefile的规则。

Makefile目标规则的一般语法为-

target [target...] : [dependent ....]
[ command ...]

在上面的代码中,方括号中的参数是可选的,省略号表示一个或多个。在这里,请注意,每个命令前的选项卡都是必需的。

下面给出一个简单的示例,您在其中定义一个规则以使来自其他三个文件的目标打招呼。

hello: main.o factorial.o hello.o
   $(CC) main.o factorial.o hello.o -o hello

–在此示例中,您将必须提供规则以从源文件中创建所有目标文件。

语义非常简单。当您说“ make target”时, make将找到适用的目标规则。并且,如果任何一个依赖项比目标更新,则make一次执行一个命令(在宏替换之后)。如果必须创建任何依赖项,则首先发生这种情况(因此您可以进行递归)。

如果任何命令返回失败状态,则Make终止。在这种情况下,将显示以下规则-

clean:
   -rm *.o *~ core paper

Make会忽略以短划线开头的命令行返回的状态。例如,谁在乎是否没有核心文件?

在宏替换后,使命令回显命令以显示正在发生的事情。有时您可能要关闭它。例如-

install:
   @echo You must be root to install

人们开始期望Makefile中的某些目标。您应该始终先浏览。但是,可以合理地期望找到所有(或仅制造,安装和清洁)目标。

  • 全部制作-编译所有内容,以便您可以在安装应用程序之前进行本地测试。

  • make install-在正确的位置安装应用程序。

  • make clean-清理应用程序,清除可执行文件,任何临时文件,目标文件等。

Makefile隐式规则

该命令是在我们从源代码x.cpp中构建可执行文件x的所有情况下都应该起作用的命令。这可以说成是隐式规则-

.cpp:
   $(CC) $(CFLAGS) $@.cpp $(LDFLAGS) -o $@

这个隐式规则说明了如何从xc中提取x-在xc上运行cc并调用输出x。该规则是隐式的,因为未提及任何特定目标。它可以在所有情况下使用。

另一个常见的隐式规则是从.cpp(源文件)中构造.o(目标)文件。

.cpp.o:
   $(CC) $(CFLAGS) -c $<

alternatively

.cpp.o:
   $(CC) $(CFLAGS) -c $*.cpp