之前在上嵌入式设计课程的时候,稍微的了解了make跟Makefile的用法,今天重头开始学习,也对一些用法更了解了一些,现在记录一些自己的学习小结。
编写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里面有很多个目标,分别是myapp,main.o,a.o,clean。然后每个目标的冒号后面会描述目标所需要的依赖文件。而且对目标的声明的那一行是没有用Tab制表符来开头的 -
在目标声明的每一行下面,是需要执行的命令,
gcc -c xx.c命令中-c是令xx.c只生成中间目标文件.o。gcc -o 可执行目标文件名字 xx.o xx1.o命令则是依赖xx.o和xx1.o来生成你想要的可执行目标文件,如果不输入名字的话默认是a.out -
需要重点记住的是在执行命令的那一行开头要用
Tab键
现在在命令行输入make 你想要实现的目标

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

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

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

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

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