摘要:
到目前为止我们学习了编写程序用的工具、编译和下载程序用的工具,理论上来说现在已经能够进行STM32的开发了,但是还存在一个问题。用过Keil的读者应该知道,一个STM32工程里有很多的c源文件,如果没有一个工具来帮我们自动控制编译的话,那么编译命令就需要我们自己在命令行里输入,费时费力。本文将介绍编译管理工具Make,并示范如何使用Makefile控制多个c源文件的编译。
一、Make和Makefile的关系
使用Make工具的流程如下
1、编写Makefile
2、将Makefile提供给Make,Make会根据Makefile里的“说明”来有序地控制整个工程的编译。
Makefile是控制编译的一套“规则”,它说明了工程中源文件所在的位置和编译方式,Make则按照Makefile所描述的规则调用编译工具对工程进行编译,Make本身不具备编译功能,它只是调用Makefile里指定的编译器。
二、Make在windows下的安装
这里在安装Make的同时需要勾选gcc,以便在后面进行Makefile的练习。
【安装教程】
三、Makefile入门
Makefile的入门教程在网络上很容易找到,这里给出一个相对较好的教程
【跟我一起写Makefile】
四、Makefile示例
在进行本节示例前需要先确保电脑正确安装了gcc和Make,验证方法如下。
-
gcc验证
按win+r
,在弹出的窗口中输入cmd,唤出控制台,在控制台中输入gcc
并回车,出现以下输出则表示gcc已正确安装:
-
Make验证
同样在控制台中输入make
并回车,如果出现以下输出则表示Make工具正确安装:
-
编写测试用例
新建文件夹test,在test文件夹下新建main.c foo.c foo.h Makefile
四个文件
文件内容如下 -
foo.h
#ifndef __FOO_H
#define __FOO_H
void foo(int num);
#endif
- foo.c
#include "foo.h"
#include <stdio.h>
void foo(int num)
{
printf("[foo]->%d\n",num);
}
- main.c
#include <stdio.h>
#include "foo.h"
int main()
{
printf("[main]->test\n");
foo(100);
return 0;
}
本例在foo.c
中定义了一个函数,其功能是在屏幕上打印输入的数字。在main
函数中调用foo()
函数,输出提示信息。
接下来编写Makefile,这之前先理一遍这个测试工程的编译过程
1、使用gcc编译main.c生成中间文件main.o
2、使用gcc编译foo.c生成中间文件foo.o
3、使用链接器ld链接main.o、foo.o,生成最终的输出文件main.exe
按照这个流程编写的Makefile内容如下
- Makefile
main.exe: main.o foo.o
gcc main.o foo.o -o main
foo.o: foo.c
gcc -c foo.c -o foo.o
main.o: main.c
gcc -c main.c -o main.o
从Makefile中可以看到书写顺序和处理流程是反的,即处理流程是从源文件到可执行文件,但Makefile的书写是从可执行文件一步步逆推到源文件。
- 编译运行
打开控制台,使用cd
命令进入到test文件夹所在位置,输入make
并回车,编译结束后能看到生成了main.exe可执行文件和中间文件main.o、foo.o。
在控制台中输入main.exe
并回车,运行测试程序。
至此本节简要介绍了Make工具,编写了一个简单的Makefile用于指导生成可执行文件,Makefile还有更加复杂和灵活的语法,有兴趣的读者可自行寻找资料,深入了解。
文中若有不当或错误之处,欢迎读者提出建议。