[arm学习]makefile学习总结
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学习总结的更多相关文章
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
- (二)我的Makefile学习冲动&&编译过程概述
前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...
- makefile 学习归纳
makefile 学习归纳 一直希望 好好整理下 makefile的写法,这在linux编程界是必备技能.下面就好好的说道说道. 可以参考的大神总结 整理 makefile是供make命令执行的 脚本 ...
- <转>Windows平台下Makefile学习笔记(二)
本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...
- <转>Windows平台下Makefile学习笔记(一)
本文转自:http://blog.csdn.net/clever101/article/details/8147352 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发 ...
- makefile学习(1)
GNU Make / Makefile 学习资料 GNU Make学习总结(一) GNU Make学习总结(二) 这篇学习总结,从一个简单的小例子开始,逐步加深,来讲解Makefile的用法. 最后用 ...
- 【VS开发】Windows平台下Makefile学习笔记
作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开 ...
- IT人的自我导向型学习:学习的4个层次
谈起软件开发一定会想到用什么技术.采用什么框架,然而在盛行的敏捷之下,人的问题逐渐凸显出来.不少企业请人来培训敏捷开发技术,却发现并不能真正运用起来,其中一个主要原因就是大家还没有很好的学习能力.没有 ...
- IT人的自我导向型学习:学习的3个维度
看到大家对我的文章赞了不少,看来大家还比较喜欢看.园子里的一些朋友和我说:”终于又看到你要在园子里发原创文章了.几年前就受益匪浅,经过几年的成长分享来的东西肯定也是精品.“ 感谢大家对我的信任,如果你 ...
随机推荐
- 简单CNN 测试例
1.训练数据: import tensorflow as tf import cv2 import os import numpy as np import time import matplotli ...
- Oracle EBS 物化视图
怎么理解物化视图呢,先随意拿一个建物化视图的例子看一下. create materialized view EBS_ACCOUNTS_HIERARCHY_MV refresh complete on ...
- QtDesigner与程序设计模式
在我的上一篇博文中提到我认识到UI设计的重要性.在这里将解析一下使用QtDesigner设计UI进行程序GUI的设计,QtDesigner的.ui文件可以转化为许多的程序代码,比如我知道的就有:c++ ...
- PowerShell发送邮件(587)
#定义邮件服务器 $smtpServer = "mail.xx.com" $smtpUser = "sender" $smtpPassword = " ...
- [Python_4] Python 面向对象(OOP)
0. 说明 Python 面向对象(OOP) 笔记.迭代磁盘文件.析构函数.内置方法.多重继承.异常处理 参考 Python面向对象 1. 面向对象 # -*-coding:utf-8-*- &quo ...
- [Spark Core] Spark Shell 实现 Word Count
0. 说明 在 Spark Shell 实现 Word Count RDD (Resilient Distributed dataset), 弹性分布式数据集. 示意图 1. 实现 1.1 分步实现 ...
- 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇
第三方登录平台接入 (QQ\微信登录) QQ登录接入 第一步成为QQ应用开发者,审核期限七天 一.所需材料 1.公司注册相关信息 2.营业执照扫描件 微信登录接入 第一步成为微信开发平台开发者,认证费 ...
- 声明式编程:程序=数据+逻辑(what)+算法(控制+计算)
接口:what: 实现:算法:指令: 编程语言中,凡是不涉及到算法的部分,都可以认为是声明式编程. 命令式编程可以与算法划等号:算法要求严格的计算逻辑和控制,是实施细节的精准描述: 命令式编程与声明式 ...
- centos7 安装svn, 同时支持 svn 和 http访问
1. 安装 svn [root@svn conf]#yum install subversion [root@svn conf]# svn --version svn, version 1.7.14 ...
- 记录因xen而导致lvs,realserver转发activeconn为0
8.81----vip,keepalived 8.82----realserver 8.83----realserver 8.84----realserver 在8.81上ipvsadm -Ln的时候 ...