编写第一个Makefile(HelloWorld)

什么是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就完事了!!!

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值