Makefile 实例实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile 实例实践相关的知识,希望对你有一定的参考价值。

本文为原创文章,转帖需指明该文链接

目录结构如下:

    comm/inc/apue.h

    comm/errorhandler.c

    atexit.c

    Makefile

文件内容如下:

    apue.h

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <errno.h>  //for definition of erron
  5 #include <stdarg.h> //ISO C variable arguments
  6 #define MAXLINE     4096 //max line length
  7 void err_dump(const char *fmt, ...);
  8 void err_msg(const char *fmt, ...);

    errorhandler.c

  1 #include "apue.h"
  2 
  3 #define ERR_MESSAGE_NEED    1
  4 #define ERR_MESSAGE_NO      0
  5 
  6 static void err_doit(int errnoflag, int error, const char *fmt, va_list ap);
  7 
  8 //print a message, dupm core, and terminate
  9 void err_dump(const char *fmt, ...)
  10 {
  11     va_list ap;
  12     va_start(ap, fmt);
  13     err_doit(ERR_MESSAGE_NEED, errno, fmt, ap);
  14     va_end(ap);
  15     abort();
  16     exit(1);
  17 }

    atexit.c

  1 #include "apue.h"
  2 
  3 static void my_exit1(void);
  4 static void my_exit2(void);
  5 
  6 int main(void)
  7 {
  8     if(0 != atexit(my_exit2))
  9         err_sys("can‘t register my_exit2");
 10     if(0 != atexit(my_exit1))
 11         err_sys("can‘t register my_exit1");
 12     if(0 != atexit(my_exit1))
 13         err_sys("can‘t register my_exit1");
 14     printf("main is done\n");
 15     return 0;
 16 }

    Makefile

  1 CC       = gcc
  2 CFLAGS   = -Wall -O -g
  3 CXXFLAGS =
  4 INCLUDE  = -I ./comm/inc
  5 TARGET   = atexit
  6 #search paths for errorhandler.c,当存在多个路径时,可以使用 空格 或 : 来分割这些路径
  7 vpath %.c ./comm
  8 #下行是为依赖项 apue.h 准备的,比如 [errorhandler.o:errorhandler.c apue.h] 里的
  9 vpath %.h ./comm/inc
 10 
 11 OBJS     = errorhandler.o atexit.o
 12 all:$(OBJS)
 13    $(CC) $(CFLAGS) $(INCLUDE) -o $(TARGET) $^
 14    @echo ---target:[email protected]
 15    @echo ---depend:$^
 16 #下行的 apue.h,可以不必写出来
 17 errorhandler.o:errorhandler.c apue.h
 18    $(CC) $(CFLAGS) $(INCLUDE) -c $^
 19    @echo ---target:[email protected]
 20    @echo ---depend:$^
 21 atexit.o:atexit.c apue.h
 22    $(CC) $(CFLAGS) $(INCLUDE) -c $^
 23    @echo ---target:[email protected]
 24    @echo ---depend:$^
 25 clean:
 26    rm -f *.o
 27    rm -f $(TARGET)

在 Makefile 里

    INCLUDE  = -I ./comm/inc 是为 gcc 编译文件时使用的

    vpath %.c ./comm  vpath %.h ./comm.inc 是为 make 程序使用

    @echo ---target:[email protected]  是为了测试 [email protected] 是什么内容   @echo ---depend:$^ 是为了测试 $^ 是什么内容

Makefile 的自动变量

    [email protected]  表示目标文件
    $^    表示所有的依赖文件
    $<    表示第一个依赖文件
    $?    表示比目标还要新的依赖文件列表

以上是关于Makefile 实例实践的主要内容,如果未能解决你的问题,请参考以下文章

Makefile

请教多文件夹makefile问题

vim+makefile入门编辑,编译,差错实例

makefile中的Cflags用法

创建片段而不从 java 代码实例化它

Golang Gin实践 番外 请入门 Makefile