makefile
要想把写好的程序放到linux下编译,必不可少的要使用到makefile文件。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。下面讲下makefile简单的编写例子。
1、 Makefile的规则
target : prerequisites ...
command
...
...
-------------------------------------------------------------------------------
target:也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites:就是,要生成那个target所需要的文件或是目标。
command:也就是make需要执行的命令。(任意的Shell命令)
2、 简单例子
2.1、一个执行文件(自己本次使用的)
objects = dhcpv4.o
dhcpv4 : $(objects)
gcc -o dhcpv4 $(objects)
dhcpv4.o : dhcpv4.c dhcpv4.h
gcc -c dhcpv4.c
clean :
rm dhcpv4 $(objects)
dhcpv4 即为最终的target文件,make编译后,执行./dhcpv4运行程序。
clean 为清除命令,执行./clean将会清除可执行文件dhcpv4,如果要继续运行程序,需重新make生成dhcpv4。
注释:
Objects为定义的常量,非常类似于C语言中的宏定义;
$(objects)为prerequisites;
gcc -o dhcpv4 $(objects)生成对应的.o文件;
gcc -c dhcpv4.c生成对应的.c文件。
2.2、俩个执行文件
# phony 目标可以有依赖关系。
.PHONY : dhcpv6 dhcpv4
dhcpv4 : dhcpv4.o common.o
gcc -o dhcpv4 dhcpv4.o common.o
dhcpv4.o : dhcpv4.c dhcpv4.h common.h
gcc -c dhcpv4.c
dhcpv6 : dhcpv6.o common.o
gcc -o dhcpv6 dhcpv6.o common.o
dhcpv6.o : dhcpv6.c dhcpv4.h common.h
gcc -c dhcpv6.c
common.o : common.c common.h
gcc -c common.c
clean :
rm dhcpv4 dhcpv4.o common.o dhcpv6.o
dhcpv4与dhcpv6为最终的target文件,make编译后,可选择执行不同命令(./dhcpv4或./dhcpv6),运行相对应的功能。
请注意,在 “gcc”命令之前必须要有一个tab缩进。语法规定Makefile中的任何命令之前都必须要有一个tab缩进,否则make就会报错。
3、 参考资料
Makefile简易教程:https://www.cnblogs.com/owlman/p/5514724.html
浅谈 Linux 下 Makefile 编写:http://blog.jobbole.com/100209/
Makefile经典教程(掌握这些足够):https://blog.csdn.net/ruglcc/article/details/7814546
4、 附加
编译时出现*** missing separator (did you mean TAB instead of 8 spaces?). Stop.
makefile应该是:
program:make.o
<TAB>gcc make.o -o make
make.o:make.c
<TAB>gcc -c make.c
要在每个动作行之前必须加一个<tab>