Makefile 实例实践
本文为原创文章,转帖需指明该文链接
目录结构如下:
comm/inc/apue.h
comm/errorhandler.c
atexit.c
Makefile
文件内容如下:
apue.h
#ifndef __apue_h__
2 #define __apue_h__ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h> //for definition of erron
#include <stdarg.h> //ISO C variable arguments
#define MAXLINE 4096 //max line length
void err_dump(const char *fmt, ...);
1 void err_msg(const char *fmt, ...); #endif
errorhandler.c
#include "apue.h" #define ERR_MESSAGE_NEED 1
#define ERR_MESSAGE_NO 0 static void err_doit(int errnoflag, int error, const char *fmt, va_list ap); //print a message, dupm core, and terminate
void err_dump(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(ERR_MESSAGE_NEED, errno, fmt, ap);
va_end(ap);
abort();
exit();
}
atexit.c
#include "apue.h" static void my_exit1(void);
static void my_exit2(void); int main(void)
{
if( != atexit(my_exit2))
err_sys("can't register my_exit2");
if( != atexit(my_exit1))
err_sys("can't register my_exit1");
if( != atexit(my_exit1))
err_sys("can't register my_exit1");
printf("main is done\n");
return ;
}
Makefile
CC = gcc
CFLAGS = -Wall -O -g
CXXFLAGS =
INCLUDE = -I ./comm/inc
TARGET = atexit
#search paths for errorhandler.c,当存在多个路径时,可以使用 空格 或 : 来分割这些路径
vpath %.c ./comm
8 #下行是为依赖项 apue.h 准备的,比如 [errorhandler.o:errorhandler.c apue.h] 里的
vpath %.h ./comm/inc OBJS = errorhandler.o atexit.o
all:$(OBJS)
$(CC) $(CFLAGS) $(INCLUDE) -o $(TARGET) $^
@echo ---target:$@
@echo ---depend:$^
16 #下行的 apue.h,可以不必写出来
errorhandler.o:errorhandler.c apue.h
$(CC) $(CFLAGS) $(INCLUDE) -c $^
@echo ---target:$@
@echo ---depend:$^
atexit.o:atexit.c apue.h
$(CC) $(CFLAGS) $(INCLUDE) -c $^
@echo ---target:$@
@echo ---depend:$^
clean:
rm -f *.o
rm -f $(TARGET)
在 Makefile 里
INCLUDE = -I ./comm/inc 是为 gcc 编译文件时使用的
vpath %.c ./comm vpath %.h ./comm.inc 是为 make 程序使用
@echo ---target:$@ 是为了测试 $@ 是什么内容 @echo ---depend:$^ 是为了测试 $^ 是什么内容
Makefile 的自动变量
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
Makefile 实例实践的更多相关文章
- makefile实例(1)-helloworld
简单makefile实例 1,源文件: main.cpp #include <stdio.h> int main() { printf("Hello World\n") ...
- Ubuntu下比较通用的makefile实例
本文转自http://blog.chinaunix.net/uid-20608849-id-360294.html 笔者在写程序的时候会遇到这样的烦恼:一个项目中可能会有很多个应用程序,而新建一个应 ...
- Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)
一.确认已经装好了GCC和Make的软件包 可以使用whereis命令查看: 如果whereis gcc和whereis make命令有结果,说明安装了这两个软件,可以继续往下做. 二.使用GCC ...
- makefile实例(3)-多个文件实例优化
我们先看一下make是如何工作的在默认的方式下,也就是我们只输入make命令.那么,1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件.2.如果找到,它会找文件中的第一 ...
- makefile实例(2)-多个文件实例
1,源文件依赖关系 defs.h command.h buffer.h main.cpp * util.cpp * kde.cpp * * command.cpp * * display.cpp * ...
- RxJava/RxAndroid 使用实例实践
原文地址 RxAndroid Tutorial响应式编程(Reactive programming)不是一种API,而是一种新的非常有用的范式,而RxJava就是一套基于此思想的框架,在Android ...
- Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入) 转
http://www.crazyant.net/2011/10/29/linux%E4%B8%8Bgcc%E5%92%8Cmakefile%E5%AE%9E%E4%BE%8B%EF%BC%88%E4% ...
- makefile实例
#.PHONY:cleanall cleanobj cleandiff #cleanall:cleandiff cleanobj # rm program #cleanobj: # rm obj.c ...
- Makefile 实例
CROSS_COMPILE = HI_CFLAGS= -Wall -O2 -g -march=armv7-a -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=vfpv ...
随机推荐
- 同步和异步 阻塞和非阻塞 IO多路复用和select总结
同步和异步的概念 同步是指用户线程发起IO请求后,需要等待或者轮询内核IO操作完成后才能继续执行: 异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程或者调用用户线程注册的回 ...
- scrapy-splash抓取动态数据例子八
一.介绍 本例子用scrapy-splash抓取界面网站给定关键字抓取咨询信息. 给定关键字:个性化:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 二.网站信息 ...
- (转)intellij idea svn 修改文件后,父文件夹也标注修改
svn文件修改后,默认只有当前文件更改而父文件没有标注,很不直观:查了一顿后,发现,可以设置: File—->settings—->version control—–>勾选show ...
- 云计算之路-Azure vs 阿里云:从负载均衡中摘/挂虚拟机
@小尾鱼 在 试用Azure:上不了高速的跑车,无法跨Cloud Service的DNS服务器一文的评论中提了一个很好的问题: 问个问题,使用了负载均衡以后,程序发布的时候博客园是怎么避免用户访问到正 ...
- java小游戏代码
一. 需求分析 曾几何时,游戏是海洛因的代名词,让人与玩物丧志联系在一起.一度遭到社会反感和家长抵制.可是.随着互联网的发展,和游戏潜在优点被发现.游戏的价值開始逐渐被社会认可,人们開始接受.认识和了 ...
- BitConverter.GetBytes(int)和BitConverter.ToString 方法 (Byte[])
BitConverter.ToString 方法 (Byte[]) 网址:https://msdn.microsoft.com/zh-cn/library/3a733s97(v=vs.110).asp ...
- JAVA 画图机制
java学习脚印:深入java绘图机制 写在前面 封装性越好的类在使用时,只要清楚接口即可,而不应该让程序员了解其内部结构; 对于平常的绘图来讲,java绘图机制无需了解太多,但是朦胧容易产生错误,绘 ...
- 对象的序列化(Serialization)
一.什么是序列化 序列化表示将一个对象转换成可存储或可传输的状态,序列化后对象可以在网络上进行传输,也可以存储到本地.对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下 ...
- C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例
C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例 Unity中循环遍历每一个数据,并做出推断 非常多时候.游戏在玩家做出推断以后.游戏程序会遍历玩家身上大量的所需数据,然后做出推断. ...
- struts2中文件上传
注意点 private File image;//对应的就是表单中文件上传的那个输入域的名称,Struts2框架会封装成File类型的 private String imageFileName;// ...