makefile不仅仅是一个命令的集合体,其中有一些规则是需要理解掌握的。

首先,了解makefile的规则:

//-----------格式----------

目标 : 依赖1,依赖2

(TAP键)命令

//-------------------------

1、目标,就是我们想生成的文件。

2、依赖往往是我们已经有的文件,是生成目标的必要条件。

3、命令就是利用依赖来产生目标。

命令不是任何情况都可以执行的,它是有条件的:

1、目标不存在 or  2、依赖已更新(首先依赖是存在的)。

牛刀小试:

1、编译和链接放一块了:

hello: hello.c  a.c

gcc -o hello  hello.c  a.c

hello是目标,命令执行后会被生成。hello可通过“.\hello”执行。

gcc 可以理解为是linux中的一个软件,而 -o 就是软件中的一个按键(选项),hello.c  a.c就是已经添加的模块文件。

这就是命令,就像是你在windows里打开一个软件,添加文件,然后按下编译按钮。命令就是这么一回事。

2、编译和链接分开:

过程分析:首先目标hello 依赖于 hello.o 和 a.o

结果这两个依赖不存在,那么向下找目标。

发现目标hello.o,依赖于hello.c(这个是存在的)。满足目标不存在

那么执行命令 gcc -o hello -c hello.c//表示编译hello.c输出hello.o但不链接。

下边的同理。。。。。。。

现在两个.o文件都有了,那么这条命令可以执行了:

gcc -o hello  hello.o a.o//链接这两个文件,输出hello可执行文件。

这样的好处是:

利用规则:1、目标不存在。or 2、依赖已更新(首先依赖是存在的)。

可以不编译,没有修改的文件,从而节省编译时间。

最后,还可以简写:

分析下:

$@ 表示的是目标(的集合);

$^ 表示的是依赖(的集合);

%.o 表示所有的.o文件

%.c 表示所有的.c文件

$<  表示(目标:后面列表里)第一个依赖!

这里提一点:

1、当我们执行make的时候,我们的目的是,参数该文件的第一个目标,就是hello。所以clean 下的命令并不会执行。

2、clean是一个虚拟的目标,并没有依赖项。我们可以通过 make clean 这个命令去执行它下边这个命令(清楚掉所有的.o文件)

再来看一个复杂一点的:

第一行是什么,意思目前我也不知道,可以把它看成是一个函数,makefile中调用函数的方式就是”$( ) ”

arm-linux-gcc 就是linux的中的另一个软件了——交叉编译器。

何为,交叉编译?就是在一个平台编译,生成一个可以在另一个平台运行的文件。

具体看看这句:

arm-linux-gcc  $(CFLAGS)  -c  -o  crt0.o  crt0.S

看着“-c  -o  crt0.o  crt0.S”这条命令的顺序,你是否感觉奇怪?

如果,你把-c  -o 理解成两个按键,感觉可能好很多。

之所以这么随意的顺序,去写,是因为这些选项往往有一个特性,就是忽略掉后面自己不需要的文件。

这段makefile以后还会具体分析,今天就到这里~~

2014-11-25

宋桓公

[arm学习]makefile学习总结的更多相关文章

  1. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  2. (二)我的Makefile学习冲动&&编译过程概述

    前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...

  3. makefile 学习归纳

    makefile 学习归纳 一直希望 好好整理下 makefile的写法,这在linux编程界是必备技能.下面就好好的说道说道. 可以参考的大神总结 整理 makefile是供make命令执行的 脚本 ...

  4. <转>Windows平台下Makefile学习笔记(二)

    本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...

  5. <转>Windows平台下Makefile学习笔记(一)

    本文转自:http://blog.csdn.net/clever101/article/details/8147352 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发 ...

  6. makefile学习(1)

    GNU Make / Makefile 学习资料 GNU Make学习总结(一) GNU Make学习总结(二) 这篇学习总结,从一个简单的小例子开始,逐步加深,来讲解Makefile的用法. 最后用 ...

  7. 【VS开发】Windows平台下Makefile学习笔记

    作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开 ...

  8. IT人的自我导向型学习:学习的4个层次

    谈起软件开发一定会想到用什么技术.采用什么框架,然而在盛行的敏捷之下,人的问题逐渐凸显出来.不少企业请人来培训敏捷开发技术,却发现并不能真正运用起来,其中一个主要原因就是大家还没有很好的学习能力.没有 ...

  9. IT人的自我导向型学习:学习的3个维度

    看到大家对我的文章赞了不少,看来大家还比较喜欢看.园子里的一些朋友和我说:”终于又看到你要在园子里发原创文章了.几年前就受益匪浅,经过几年的成长分享来的东西肯定也是精品.“ 感谢大家对我的信任,如果你 ...

随机推荐

  1. 大数据【二】HDFS部署及文件读写(包含eclipse hadoop配置)

    一 原理阐述 1' DFS 分布式文件系统(即DFS,Distributed File System),指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.该系统架构 ...

  2. 安卓测试【二】eclipse离线安装ADT

    为什么要配置ADT呢?这就相当于在eclipse里插入插件,可以编译android的相关程序. 为什么要离线呢?一个字,快!我在线装了一个下午的ADT,不是报错就是慢的跟头老牛似的. 所以我在网上下了 ...

  3. RecyclerView 下拉刷新和加载更多

    一.SwipeRefreshLayout实现下拉刷新 1.方法API: setOnRefreshListener(OnRefreshListener):添加下拉刷新监听器 setRefreshing( ...

  4. 初探性能优化——2个月到4小时的性能提升(copy)推荐阅读

    一直不知道性能优化都要做些什么,从哪方面思考,直到最近接手了一个公司的小项目,可谓麻雀虽小五脏俱全.让我这个编程小白学到了很多性能优化的知识,或者说一些思考方式.真的感受到任何一点效率的损失放大一定倍 ...

  5. oracle数据库occi接口写入中文乱码解决方法

    将初始化代码中 Environment::createEnvironment(Environment::DEFAULT); 改为 Environment::createEnvironment(“UTF ...

  6. 10款jQuery文本高亮插件

    [编者按]本文作者为 Julian Motz,主要介绍十款 jQuery 文本高亮插件的现状.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 很多应用或网站都为用户提供搜索关键词的方法.为了 ...

  7. Tmux 使用教程 on Fedora 28

    Tmux 和 gun/screen 都是优秀的终端复用软件,它的关键的好处就是,保持ssh 登录连接session不中断,并且能支持分屏操作,具备丰富的命令行参数,可以进行动态布局和操作.可以看作为s ...

  8. css常见的概念

    padding-top:10px;是指容器内的内容距离容器的顶部有10个像素,是包含在容器内的: margin-top:10px;是指容器本身的顶部距离其他容器有10个像素,不包含在容器内: top: ...

  9. Spring Boot session与cookie的使用

    Session import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import ...

  10. Alpha冲刺报告(9/12)(麻瓜制造者)

    今日已完成 邓弘立: 正在进行主页逻辑的编写 符天愉: 部署商品发布和物品需求的接口 江郑: 尝试完善接口文档,进行进一步测试 刘双玉: 编写接口说明 肖小强: 进行逻辑模块的编写 李佳铭: 修改了U ...