在对makefile进行了部分学习后,感觉到还是多看看简短的例子比较好。
发现下面这个网站讲得很好:
http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
hellomake.c:
复制代码
#include 
int main() {
// call a function in another file
myPrintHelloMake();
return(0);
}
复制代码
hellofunc.c:
复制代码
#include 
#include 
void myPrintHelloMake(void) {
printf("Hello makefiles!\n");
return;
}
复制代码
hellomake.h:
/*
example include file
*/
void myPrintHelloMake(void);
第一个 makefile的例子:
hellomake: hellomake.c hellofunc.c
gcc -o hellomake hellomake.c hellofunc.c -I.
hellomake 是规则名;它的前提条件是:hellomake.c 和 hellofunc.c。
在此规则中,我们要执行的片段是: gcc -o hellomake hellomake.c hellofunc.c -I
第二个 makefile的例子:
CC=gcc
CFLAGS=-I.
hellomake: hellomake.o hellofunc.o
$(CC) -o hellomake hellomake.o hellofunc.o -I.
此处定义了 变量 cc 和 CFLAGS , 这也是很多 makefile中很常见的两个变量。
此时,规则 hellomake 依赖于两个目标文件 hellomake.o 和 hellofunc.o ,
而且这里有一个隐含的依赖关系:
hellomake.o 来自于对 hellomake.c 的编译
hellofunc.o 来自于 对 hellofunc.c 的编译
由于为了生成 hellomake,需要 hellomake.o 和 hellofunc.o ,
就意味着实际上需要 hellomake.c 和 hellofunc.c。
$(CC) 就代表了 gcc 命令,此处实际上还尚未使用 CFLAGS 变量。
第三个 makefile例子:
复制代码
CC=gcc
CFLAGS=-I.
DEPS = hellomake.h
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: hellomake.o hellofunc.o 
gcc -o hellomake hellomake.o hellofunc.o -I.
复制代码
%.o: 规则表明:每一个 .o 文件,都是依赖于 同名的 .c 文件,和 DEPS 所定义的头文件。
具体为了生成此 .o 文件,需要进行编译动作:
$(CC) -c -o $@ $< $(CFLAGS)
其中 $(CC) 和 -c -o 都不用解释了。
$@表示的就是 冒号左边的内容,即某个.o 文件。
$<表示的就是 冒号右边的第一个参数,即此同名的.c 文件。
$(CFLAGS) 在这里就是 -I。
第四个 makefile例子:
复制代码
CC=gcc
CFLAGS=-I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o 
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
复制代码
同上个例子相比,它又定义两个 OBJ变量。
hellomake 依赖于 OBJ变量所指代的目标文件,
gcc -o $@ $^ $(CFLAGS) 中,其他的都不用再解释了。
$^ 是冒号右边的值,这里就是 $(OBJ),也就是 hellomake.o, hellofunc.o。
第五个 makefile例子:
复制代码
IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR =../lib
LIBS=-lm
_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 
复制代码
这里面 IDIR,LDIR,ODIR 分别指定了 头文件/库文件/输出目标文件的目录。
来看这一句:
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
patsubst 是一个 函数,它会把所有 % 所代表的文件字符串,改变为 头文件目录下的 文件字符串。
第三个参数 $(_DEPS)指明了这个 函数的作用范围。
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 的作法与此类似。
其他的,也没有什么可以说的了,但是 这里有一个伪规则 clean。它是没有前提条件的。
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 中,
*~ , 我猜测代表的是 所有没有扩展名的文件。core 指代的是程序出错时生成的 core 文件。
标签: Makefile, example
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/09/17/2688165.html,如需转载请自行联系原作者

make 学习体会(一)相关推荐

  1. c#学习体会:使用 ref 和 out 传递数组

    c#学习体会:使用 ref 和 out 传递数组(downmoon),希望与大家分享1.与 所有的 out 参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由接受方为其赋值. 例如: ...

  2. 小学生计算机课学生心得,【小学信息技术学习体会13篇】_小学信息技术学习体会范文大全_2021年小学信息技术学习体会_东城教研...

    小学信息技术学习体会 大家都对小学信息技术学习体会特别关注,东城教研特别为大家整理了一些有关小学信息技术学习体会的内容,其中,培养学生的创新意识和创造能力.下面就结合我的教学实践,谈谈我的几点体会.一 ...

  3. 近期爬虫学习体会以及爬豆瓣Top250源码实战

    近期爬虫学习体会以及爬豆瓣Top250源码实战 我是在B站https://www.bilibili.com/video/BV12E411A7ZQ?p=25里学习的,至今已经可以手写爬豆瓣Top250代 ...

  4. Office计算机心得,OFFICE心得学习体会.ppt

    OFFICE心得学习体会.ppt 会专61001 唐林 21 会专61001 唐林 21 会专61001 唐林 21 记在大一结束前 * 会专61001 唐林 21 * 我学word 我学习计算机,就 ...

  5. JavaOOP(面向对象)学习体会

    JavaOOP(面向对象)学习体会 类和对象的概念 类:具体相同特征和行为的事物的抽象 对象:万事万物皆对象 类是对象的类型! 对象是类的实例 ! 封装 //特征---->属性(特性)Strin ...

  6. 决策树总结(个人学习体会)

    决策树总结(个人学习体会) 算法定义 决策树:是一种监督学习(Supervised Learning)方法,通过不断对某个属性进行判断得到一个分支最终形成决策树,这个决策树能够对新的数据进行正确的分类 ...

  7. 操作系统学习体会之进程管理篇

    计算机基础知识的学习中,操作系统则是重中之重.继对微机原理和计算机组成原理的基础知识了解和学习后,对硬件和基础原理的理论有了初步的了解,结合在所在公司的项目中开发应用的经历和体会,进行了操作系统的学习 ...

  8. 【学习体会】Lighttools8.4.0:设置虚拟相机+仿真结果3D显示

    *关于Lighttools8.4.0软件的安装教程,详见我的另一篇博文:[软件安装]win10下Lighttools8.4.0(64)光学系统建模软件的安装教程 *关于Lighttools8.4.0软 ...

  9. YouTube 架构学习体会

    YouTube 架构学习体会 来源:http://www.oschina.net/question/12_32459 这几天一直在关注和学习一些大型网站的架构,希望有一天自己也能设计一个高并发.高容错 ...

  10. OpenCV2.0 peopledetect 学习体会---转自opencv中文论坛

    wsyjwps1983 的 OpenCV2.0 peopledetect 学习体会---转自opencv中文论坛 OpenCV2.0提供了行人检测的例子,用的是法国人Navneet Dalal最早在C ...

最新文章

  1. 未来十年,人机交互将是重要的发展
  2. 卡尔曼滤波:究竟滤了谁?
  3. lib和dll文件的区别和联系
  4. python requests模块使用
  5. [原创] hadoop学习笔记:wordcout程序实践
  6. ORA-25153: Temporary Tablespace is Empty
  7. php解密 码表,php拼音码表的生成
  8. clion编写C++ 使用多线程时候,CMakeLists.txt书写,引用-pthread
  9. 图论 —— 图的连通性 —— 传递闭包
  10. Leetcode之删除链表的倒数第N个节点
  11. 全球与中国高精度漆包扁铜线市场深度研究分析报告
  12. 大众点评有多少用户2019_2019全国大众点评网数据下载获取
  13. linux系统中如何打开察看img文件内容
  14. 关于音频采样率,音频帧率,每次采集多少字节的理解
  15. arm版红帽企业linux,红帽:ARM架构下的Linux不是玩笑
  16. 如何利用数据挖掘让RTB广告效果倍增?
  17. 通过单击按钮实现全屏、退出全屏
  18. 切换窗口时改变页面title标题
  19. gcc: internal compiler error: Killed (program cc1plus)
  20. WinRAR误装其他语言版本卸载重装后右键依旧存在外文

热门文章

  1. Windows Mobile与OPhone开发对比
  2. 突然想起来,前天是感恩节。
  3. spring 04-Spring框架依赖注入基本使用
  4. Linux(DeepInOS) 下 mysql 的安装与基本配置
  5. 【题解】 bzoj2748 [HAOI2012]音量调节 (动态规划)
  6. Docker 私有仓库 Harbor registry 安全认证搭建 [Https]
  7. Vue.js实现前段评论展示
  8. PostgreSQL 客户端乱码问题
  9. 【Java】Calendar获取年、月、日、时间
  10. 文本读取写入易错问题