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]  表示目标文件
    $^    表示所有的依赖文件
    $<    表示第一个依赖文件
    $?    表示比目标还要新的依赖文件列表

时间: 2024-10-08 20:45:17

Makefile 实例实践的相关文章

makefile实例(1)-helloworld

简单makefile实例 1,源文件: main.cpp #include <stdio.h> int main() { printf("Hello World\n"); return 0; } 2,编写makefile 若使用g++命令编译链接程序,可以: g++ -o hello main.cpp 或 g++ [-o main.o] -c main.cpp g++ -o hello main.o 若使用make命令,则可以这么编写makefile文件(两种写法分别对应了

Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)

一.确认已经装好了GCC和Make的软件包 可以使用whereis命令查看: 如果whereis  gcc和whereis  make命令有结果,说明安装了这两个软件,可以继续往下做. 二.使用GCC编译运行一个HelloWorld程序(只涉及单个文件) 可以在任何一个目录编写C程序然后编译运行,我这个实例在自己主目录进行: 然后就进入了编写程序的界面: 按下键盘”i”进入编辑界面,然后输入程序: 按ESC(进入命令行模式),然后输入”:wq”,冒号表示开始输入命令,字母w代表保存文件,字母q代

Ubuntu下比较通用的makefile实例

本文转自http://blog.chinaunix.net/uid-20608849-id-360294.html 笔者在写程序的时候会遇到这样的烦恼:一个项目中可能会有很多个应用程序,而新建一个应用程序则所有的Makefile都要重写一遍,虽然可以部分的粘帖复制,但还是感觉应该找到更好的解决途径:另外当一个应用程序中包含多个文件夹时通常要在每个目录下创建一个Makefile,当有数十个文件夹时,要创建如此多的Makefile也是不胜其烦.那么为什么不用automake呢,诚然,对于一个很大的工

zabbix监控MySQL多实例实践

一.实践背景:一台机器上部署了多个MySQL实例,每个实例使用不同的端口,需要通过zabbix将其都纳入监控中. 二.实践方法及原理说明:1.在Zabbix上创建监控MySQL数据库使用的模版,导入案例模版:链接: https://pan.baidu.com/s/1nXooNPMXrmaAQidRrxVOLg 提取码: ure1 2.在模版上创建自动发现的规则,在自动发现规则中需要定义两个东西:a.键值 用来自动获取MySQL实例的端口,需要使用到主机宏{$MYSQLPORT} b.监控项原型

makefile实例(2)-多个文件实例

1,源文件依赖关系 defs.h command.h buffer.h main.cpp * util.cpp * kde.cpp * * command.cpp * * display.cpp * * insert.cpp * * search.cpp * * files.cpp * * * 2, 源文件 因为这里只是想做一下简单测试,所以很多源文件的内容都是空的. [[email protected] 1-makefile]#head *.h ==> buffer.h <== #pragm

makefile实例(3)-多个文件实例优化

我们先看一下make是如何工作的在默认的方式下,也就是我们只输入make命令.那么,1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件.2.如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件.3.如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件.4.如果edit所依赖的.o文件也

Makefile实例

A stupid man think himself is clever. A clever think himself is stupid. Make基础 先上脚本: COMPILE = g++ FLAGS = -std=c++11 -g target = epollserver objs = client.o clientmanager.o main.o savetomysql.o threadable.o libs = -L -lpthread -L/usr/lib/x86_64-linu

python基础知识代码实例实践

1 --- 2 ** 3 2 3 ---True and True 4 True or False 5 not True 6 7 ---python is a smart language 8 5 / 2 == 5.0 / 2.0 //False 9 5 * 2 == 5.0 * 2.0 // True 10 11 ---python is store values instead of expression 12 13 ---str 14 >>> 3 * 'a' 15 'aaa' 16

makefile 编写要点

#PS:请尊重原创,不喜勿喷 #PS:要转载请注明出处,本人版权所有 #PS:这个只是  <  我自己    >理解,如果和你的原则相冲突,请 谅解,勿喷 最近整理自己的文件时,发现由于太懒的原因,很多资料都来不及整理就忘掉了,很可惜,所以,在整理Makefile时,就把自己作为新手,编写makefile的一些疑问立即写下来. 1 变量赋值 varname= 是最基本的赋值 varname:= 是覆盖之前的值 varname?= 是如果没有被赋值过就赋予等号后面的值 varname+= 是添加