在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 一次执行一个命令(在宏替换之后).如果必须进行任何依赖,则首先发生(因此您有递归).

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

clean:
   -rm *.o *~ core paper

使忽略以破折号开头的命令行返回的状态.例如,谁在乎是否没有核心文件?

使用回显命令,在宏替换之后显示正在发生的事情.有时你可能想把它关掉.例如 :

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