1、什么是自动推导
自动推导也叫隐含规则,所谓隐含规则指的是,我们在Makefile文件中不使用 gcc/g++ 命令来生成目标文件,但是执行make命令以后,Makefile 会自动帮我们执行。这就是Makefile 的隐含规则,也可以称为自动推导的过程。
2、实战
首先准备三个文件 student.h、student.cpp 和主程序 main.cpp
student.h
#ifndef NAKEFILE_PROJECT_STUDEN_H
#define NAKEFILE_PROJECT_STUDEN_H
int getAge();
#endif //NAKEFILE_PROJECT_STUDEN_H
student.cpp
#include "student.h"
int getAge(){
return 1;
}
main.cpp
#include <iostream>
#include "student.h"
int main() {
std::cout << "Hello, World!" << std::endl;
std::cout << "getAge:"<<getAge() << std::endl;
return 0;
}
编写makefile(常规写法)
注意:下面的缩进,必须用tab键,不能用4个空格键代替,否则会报错
而且,makefile的前后的顺序没有要求,在编译的时候会自动排序;
main : main.o student.o
g++ -o main main.o student.o
main.o:main.cpp
g++ -c main.cpp
studen.o: student.cpp student.h
g++ -c student.cpp student.h
clean :
rm main main.o student.o
编写makefile(自动推导写法)
自动推导的写法少了很多东西,
main : main.o student.o
g++ -o main main.o student.o
main.o:
student.o: student.h
clean :
rm main main.o student.o
执行make
命令后我们会发现,我们在makefile里面没写main.cpp
,它根据main.o
自动推导出了main.cpp
的文件名称, 同理,我们在makefile文件中也没写student.cpp
,它根据student.o自动推导出了student.cpp
文件;这就是自动推导的强大之处
比较
接下来我们将常规写法和自动推导的写法做一个比较;由此可以发现,当你声明了 xxx.o
之后,它会自动去当前目录下寻找 xxx.c
或者xxx.cpp
文件;找到之后会进行编译操作;
使用变量
以上的makefile还可以用变量进行优化,优化后如下,执行结果和上面是一样的;
main=main.o
student=student.o
man_student=main.o student.o
main : $(man_student)
g++ -o main $(man_student)
$(main):
$(student): student.h
clean :
rm main $(man_student)