makefile简单编写-生成可执行文件

时间:2022-03-26 12:46:26

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>