make学习小结(一)

三月份的第一篇博客

Posted by 婷 on March 4, 2020 本文总阅读量

之前在上嵌入式设计课程的时候,稍微的了解了makeMakefile的用法,今天重头开始学习,也对一些用法更了解了一些,现在记录一些自己的学习小结。

编写Makefile文件

现在在我的MyAPP文件夹下有这三个文件

.
├── a.c
├── a.h
└── main.c

a.c:

#include <stdio.h>
#include "a.h"
void fun(void)
{
  printf("hello make\n");
}

a.h:

#ifndef __A_H_
#define __A_H_

void fun(void);

#endif

main.c:

#include <stdio.h>
#include "./a.h" //或者是 #include "a.h",因为现在头文件跟main.c是在当前目录下

int main(void)
{
	fun();//调用a.c里面的函数
	return 0;
}

main函数是一个C程序运行的入口,可以看出程序最终运行的结果是为了输出hello make。现在我们就利用make这个工具来实现这个工程。但是make的实现需要一个文件来告诉它怎么构造,这样的文件称为Makefile或者makefile。当然文件的名字也不是固定为Makefile的,如果这个文件你要改为其他名字的话,在执行make命令的时候要加上-f来指定其他除了Makefile或者makefile的文件名。

现在来编写Makefile文件:

myapp:main.o a.o   #myapp是最终的可执行文件
	gcc -o myapp main.o a.o
	
main.o:main.c a.h
	gcc -c main.c
	
a.o:a.c a.h
	gcc -c a.c

clean:
	rm *.o myapp
  • 首先可以看到注释是用#

  • Makefile里面有很多个目标,分别是myappmain.oa.oclean。然后每个目标的冒号后面会描述目标所需要的依赖文件。而且对目标的声明的那一行是没有用Tab制表符来开头的

  • 在目标声明的每一行下面,是需要执行的命令,gcc -c xx.c命令中-c是令xx.c只生成中间目标文件.ogcc -o 可执行目标文件名字 xx.o xx1.o命令则是依赖xx.oxx1.o来生成你想要的可执行目标文件,如果不输入名字的话默认是a.out

  • 需要重点记住的是在执行命令的那一行开头要用Tab

现在在命令行输入make 你想要实现的目标

1.png

因为myapp这个目标是放在第一个,如果不给make指定要实现的目标的话,则默认是声明的第一个目标

2.png

同时也可以看到我用make clean命令将第一次生成的中间目标文件与最终的可执行文件一起删除了。

运行可执行文件

3.png

改变文件名字

前面提到如果不想将告诉make如何构造程序的文件叫做Makefile,那么我们可以在make的时候加上-f参数。

4.png

最后运行我们生成的目标文件myapp

5.png

同样,要实现其他的目标也要加上-f参数

6.png