网上有不少makefile的例子,然而都晦涩难懂,有些则过于冗长,不适合新手初步掌握makefile的用法。
实际上,makefile的作用就是帮助我们便捷的编译。
掌握makefile首先要略懂gcc编译的一些简单指令
gcc的编译选项可以记做 ESCL(很像我们的离开键)
第一步是-E
例如 gcc -E 1.c 这一步的意思是预编译,假设我们有个1.c文件,打印helloworld,我们在头部加入include <stdio.h>
那么这一步就会生成一个.i文件,把stdio.h中的内容拷过来
第二步是-S
例如 gcc -S 1.i 这一步把我们上一步生成的1.i文件生成一个1.s文件,这一步叫做编译,可以把他.1文件生成为汇编代码,
第三部是-C
例如 gcc -C 1.s 这一步就是把上一步生成的1.s文件生成一个1.o文件,这一步叫做汇编,可以把.s文件生成为2进制代码。
我们的1.c文件到这就已经能用了,在终端中./1.c就可以看到helloworld
最后一步是gcc -L 1.o 这一步是把我们的二进制文件链接起来,假设我们有两个二进制文件产生,那么就需要用到这个参数,把两个二进制文件链接,当然我们这里只是打印helloworld所以不需要这么做,
如果不想搞这些东西当然也可以一步搞定,什么参数都不加,
直接gcc 1.c -o filename
讲这么多好像和makefile无关的东西
其实makefile就是让我们把这些东西写到一个文件里,并且你要有自己的逻辑顺序和关系,makefile根据这些逻辑关系决定执行哪些指令。
还是以上面那个例子说明
假设我们还是1.c文件生成的目标文件是file那么在makefile中就要这样写
file:1.c
gcc 1.c -o file
注意gcc前面是一个tab键,上面两行的意思是,(file依赖1.c文件,执行下一行命令)
命令不止可以写一行,如我们在后面再加一行,touch hello,虽然看起来是和编译毫不相干的命令,但是还是会执行
flag : 1.c #标签:依赖
gcc 1.c -o flag (tab) 终端要执行的命令(可以有多行)
touch hello
我们可以看到目录下面多了一个hello文件。
现在我们懂了,makefile的意思就是,make flag ,查看flag的标签的依赖,如果依赖不是最新,编译该依赖的命令,如果依赖已经是最新,则执行这一个标签下的命令。
如果我们make后面不接参数,则默认第一个标签。
当然,makefile还有许多高级用法,如变量,函数之类,但是不是这里要细讲的内容,总之明白makefile的本质,并且精通gcc的命令,就可以建立一些小的工程。