makefile可谓是做嵌入式大型工程中,比较重要的一环。当C工程中代码量、目录结构,逐渐增多的时候,掌握makefile的使用,对编译大型工程可谓是益处多多。

刚接触makefile的时候,仅从文字学习makefile语法可能略微干涩,本文通过一个小型C语言工程,配合多级目录下的makefile文件,实现对该工程的编译。

直接展示C工程的目录结构以及相对应的文件,如下:

linuxmakefile编译过程(C语言工程及makefile编译)(1)

(工程代码目录)

工程包括fun1(实现加法)、fun2(实现减法)、fun3(实现乘法)、fun4(实现除法)、以及main(主函数调用) ,编译结果输出到output文件夹,hexbin文件存放编译运行程序,objects存放编译各文件生成的.o文件。

在main文件夹中的makefile,添加定义变量设置demo程序的版本号:

linuxmakefile编译过程(C语言工程及makefile编译)(2)

在main.c文件中,调用makefile定义的版本号,以及其他fun1-4下的函数api:

linuxmakefile编译过程(C语言工程及makefile编译)(3)

在根目录下,执行"make"编译:

linuxmakefile编译过程(C语言工程及makefile编译)(4)

(makefile输出编译信息)

makefile脚本中控制输出结果以及保存的路径。

切换到output/hexbin目录下,执行./appDemo.exe 7 3输出测试程序如下:

linuxmakefile编译过程(C语言工程及makefile编译)(5)

(代码运行结果)

至此,一个完整的流程,从代码编写、makefile层级编写,到编译结果的输出保存以及运行。下面,将详细列出该工程中所需要的文件,刚接触makefile时可以参考借鉴。

在每个层级目录下,比如fun1、fun2等文件夹,makefile都是相同的,也就是工程文件随着目录结构增加,仅需将makefile拷贝复制,酌情修改即可。

代码介绍:

fun1下:

func1.c

linuxmakefile编译过程(C语言工程及makefile编译)(6)

func1.c

test_func1_app.c

linuxmakefile编译过程(C语言工程及makefile编译)(7)

test_func1_app.c

fun1下的makefile(其中fun1、fun2、fun3、fun4的makefile完全一样)

linuxmakefile编译过程(C语言工程及makefile编译)(8)

fun1-makefile

main文件夹下的makefile略有不同,比如我们定义了SOFTWARE_APP_VERSION版本号,但绝大多数都是和fun1下是相同的。

linuxmakefile编译过程(C语言工程及makefile编译)(9)

main-makefile

output文件夹下的makefile:

linuxmakefile编译过程(C语言工程及makefile编译)(10)

output-makefile

最外层的makefile,控制了很多输出,比较重要,如下:

linuxmakefile编译过程(C语言工程及makefile编译)(11)

top-makefile

顶层makefile,定义了编译器,以及如何进出各层级目录,输出结果保存,以及make clean清除的控制。

makefile的功能比较强大,通过一个小型的工程代入学习,从实践中,不断探索makefile的各种语法,在面对大型C工程的时候,也可以做到随遇而安。

,