定义Makefile中的规则
我们现在将学习Makefile的规则。
Makefile目标规则的一般语法是 —
target [target...] : [dependent ....]
[ command ...]
在上面的代码中,括号中的参数是可选的,省略号表示一个或多个。这里要注意的是,每个命令前面的tab是必须的。
下面给出了一个简单的例子,你定义了一个规则,使你的目标从其他三个文件中打招呼。
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
人们已经开始期待Makefiles中的某些目标。你应该总是先浏览。然而,期望找到all(或只是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