什么是Makefile
讲makefie之前,先将将什么是make;make是一个命令工具,是一个解释makefile中指令的命令工具。它可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile (or makefile) 这个文本文件,执行对应的操作。make 会自动的判别原始码是否经过变动了,而自动更新执行档。makefile其实就是一个文档,里面定义了一系列的规则指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,它记录了原始码如何编译的详细信息! makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
Makefile编写规则
TARGET … : DEPENDENCIES …
COMMAND
…
目标(TARGET)程序产生的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。
依赖(DEPENDENCIES)是用来产生目标的输入文件,一个目标通常依赖于多个文件。
命令(COMMAND)是make执行的动作,一个可以有多个命令,每个占一行。注意:每个命令行的起始字符必须为TAB字符!
编写一个Makefile
环境
我这里用的是镜像ubuntu-18.04.4
首先我们先找到一个目录(自己随意创建),然后在这个目录下创建两个文件夹
命令
mkdir hello
mkdir hello1
进入hello文件夹
cd hello
创建一个文件hello.c
vi hello.c
代码内容
#include <stdio.h>
extern void bar(void);//调用这个函数
int main()
{
bar();
return 0;
}
写完之后,进入到hello1文件夹编写一个bar.c的文件
代码内容
#include <stdio.h>
void bar(void)
{
printf("hello world\n");
}
在这个文件里面创建并编写一个Makefile
vi Makefile
内容
HELLO1DIRM = /home/majie/linux-driver/hello1/bar.o
HELLODIR = /home/majie/linux-driver/hello
OBJ = hello
SRC = bar.c
$(OBJ):
gcc -c $(SRC) //编译bar.c文件生成.o文件
cp $(HELLO1DIRM) $(HELLODIR) #把生成的bar.o 拷贝到hello目录下
我这边的格式有问题后期就报错了
Makefile:6: *** recipe commences before first target. Stop.
问题的原因:这个代表这意味着有一行以空格、制表符或其他空格开头,而前面没有目标。
所以我们要严格按照它的格式
hello1目录下的Makefile
HELLO1DIRM = /home/majie/linux-driver/hello1/bar.o
HELLODIR = /home/majie/linux-driver/hello
OBJ = hello
SRC = bar.c
$(OBJ):
gcc -c $(SRC) #编译bar.c文件生成.o文件
cp $(HELLO1DIRM) $(HELLODIR) #把生成的bar.o 拷贝到hello目录下
写完这个之后,我们要去hello这个文件夹里面也写一个Makefile
和上面编写的方式一样
查看当前路径的指令pwd
hello目录下的Makefile
HELLO1DIR = /home/majie/linux-driver/hello1#我虚拟机下创建hello1的路径
HELLODIR = /home/majie/linux-driver/hello#同上,hello的路径
SRC = hello.c
tohello:
$(MAKE) -C $(HELLO1DIR) M = $(HELLODIR) #MAKE 内置常量 执行hello文件夹下的Makefile时要先去执行hello1下的Makefile,执行完后再返回到hello这个目录下
gcc -c $(SRC) #返回到这个文件夹后去编译hello.c这个文件
gcc bar.o hello.o -o hello #把这两个bar.o hello.o文件生成可执行文件
由于我这边格式有问题后面make的时候会出下以下错误
make: *** empty variable name. Stop.
我们要改一下
$(MAKE) -C $(HELLO1DIR) M=$(HELLODIR)
等号两边都不需要空格,格式很严格
编译工程
我们首先要进入到主目录hello目录下,然后输入指令make
编译成功!
然后我么你就可以运行可执行文件hello
指令
./hello
总结
第一次接触Makefile,写的也是很粗糙,可能中间还会有错误。表面上这个hello world要完成很简单,但是自己过程中还是遇到了很多问题,比如上面提到的,几乎都是格式问题。老样子:每次都没有一帆风顺过,总会给我报错,但是面向百度,面向CSDN就完事了!!!