之前在上嵌入式设计课程的时候,稍微的了解了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
参数