在 Makefile 中定义规则


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

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

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

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

下面给出了一个简单的示例,您可以在其中定义一条规则,以从其他三个文件中创建目标 hello。

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忽略以破折号开头的命令行上返回的状态。例如,谁在乎没有 core 文件呢?

在宏替换后, Make会回显命令,以向您显示正在发生的情况。有时您可能想将其关闭。例如 -

install:
   @echo You must be root to install

人们已经开始期待 Makefile 中的某些目标。您应该始终先浏览。但是,可以合理地预期找到 all(或只是 make)、install 和 clean 目标。

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

  • 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