嵌入式linux菜鸟成长记(七)

时间:2022-02-21 08:02:41

什么是makefile?

  • 在windows中系统中,如果要编译某个底层程序,比如说-要编译一个51单片机程序,我们可以使用keil软件。打开keil软件,输入代码之后,点击编译链接就ok了,这是因为keil这类集成软件,把它要做的事情都封装好了,只需要点击一下就可以搞定所有的事情。但是,keil编译器到底做了哪些事情按?我们并不知道。编译一个程序,编译器做了以下几件事:

  • 1:预编译

  • 预编译又称为预处理 , 是做些代码文本的替换工作。 处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。

  • 2:编译

  • 把代码编译为汇编文件(.s文件)。

  • 3:汇编

  • 把汇编文件编译为目标文件(.o文件)

  • 4:链接

  • 一个程序可能有多个.c文件,那么就有多个.o文件,也可能需要一些库文件。那么链接的作用就是把多个.o文件和库文件,链接起来,生成可执行文件。

  • 那么在linux环境下,情况又是怎样的呢?编译的所有过程都需要你自己输入命令,如果文件过多的话,输入的编译命令那可就不胜其烦了!!!

  • 鉴于此,产生了Makefile文件,你可以在Makefile文件里面输入所有的编译命令,之后,只需要执行一下Makefile文件,就可以搞定一个程序的编译。

  • Makefile文件有没有其它的优点呢?当然有了,一个庞大的程序,很可能有成千上万个.c文件,完整的编译一遍要花很长一段时间。如果完整地编译完后,我需要改动其中一个.c文件,再次编译的话,并不会重新编译所有的.c文件,Makefile文件只会编译改动的.c文件,最后链接一下即可,花费的时间非常少。这可是Makefile的招牌菜哦!!!

  • 总结一下,Makefile是一个文件类型,在Makefile里面输入编译文件的逻辑命令,即可编译一个程序。

Makefile举例

  • 有三个文件.c文件:sinc.c, cosc.c, main.c,Makefile内容如下:

LIBS = -lm #库的路径
FLAGS = -g #可调式编译

#以下第一句的意思是,链接的可执行目标为main,由main.o sinc.o cosc.o链接而成。
#以下第二句的意思是,执行命令,开始链接。
main: main.o sinc.o cosc.o
gcc -o main main.o sinc.o cosc.o ${LIBS}

#以下第一句的意思是,编译的目标是main.o,由main.c编译而成。
#以下第二句的意思是,执行命令,开始编译。
main.o: main.c
gcc -c main.c

sinc.o: sinc.c
gcc -c sinc.c

cosc.o: cosc.c
gcc -c cosc.c


#删除文件main main.o sinc.o cosc.o
clean:
rm -f main main.o sinc.o cosc.o
  • 在linux的当前目录下,执行make命令,就可以执行Makefile文件,编译生成可执行文件main。

  • 在linux的当前目录下,执行make clean命令,就可以删除文件main main.o sinc.o cosc.o。

  • Makefile的诸多妙处,不能言尽,此处仅是抛砖引玉,真正的理解Makefile,还得仔细研究,自己去实践操作才行。

  • 2017年3月13日,未完待续。