在 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 忽略以破折号开头的命令行的返回状态。例如,谁在乎是否没有核心文件?
Make 在宏替换后回显命令以向您显示正在发生的事情。有时您可能想关闭它。例如 −
install:
@echo You must be root to install
人们已经开始期待 Makefile 中的某些目标。您应该始终先浏览。但是,可以合理地预期会找到所有目标(或仅 make)、install 和 clean。
make all − 它会编译所有内容,以便您可以在安装应用程序之前进行本地测试。
make install − 它会将应用程序安装在正确的位置。
make clean − 它会清理应用程序,删除可执行文件、任何临时文件、目标文件等。
Makefile 隐式规则
该命令应该适用于我们根据源代码 x.cpp 构建可执行文件 x 的所有情况。这可以表述为隐式规则 −
.cpp:
$(CC) $(CFLAGS) $@.cpp $(LDFLAGS) -o $@
此隐式规则说明如何从 x.c 中生成 x——在 x.c 上运行 cc 并调用输出 x。该规则是隐式的,因为没有提到任何特定目标。它可以在所有情况下使用。
另一个常见的隐式规则是从 .cpp(源文件)构建 .o(对象)文件。
.cpp.o:
$(CC) $(CFLAGS) -c $<
alternatively
.cpp.o:
$(CC) $(CFLAGS) -c $*.cpp