参考: 跟我一起写 Makefile

GNU make

《GNU+Make项目管理(第三版)》

1.Makefile用途

使用GNU Make工具来管理程序是每个Linux工程师必须掌握的技能。Make能够使整个程序的编译、链接只需要一个命令(make)就可以完成。

Make的工作主要依赖于一个叫为Makefile的文件。Makefile文件描述了整个程序的编译,连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译,如何最后产生我们想要得可执行文件。

2.Makefile构成

2.1 Makefile构成-规则

Makefile中最重要的组成部分是“规则”

规则:用于说明如何生成目标文件,规则的格式如下:

targets : prerequisites

               command

目标 依赖

[Tab] 命令(可以有多条)

特别注意:命令行前需要使用【TAB】键空格,一条规则里目标只有一个,依赖和命令可以有多个

例子:

led.elf: led.o

    arm-linux-ld -Tled.lds -o led.elf led.o

 

2.2 Makefile构成-伪目标

Makefile中把那些只包含命令,没有任何依赖目标称为伪目标(phony targets).

.PHONY : clean

clean :

    rm f hello main.o func.o

.PHONYclean目标声明为伪目标

 

2.3 Makefile构成-最终目标

1.当一个makefile中有多条规则时,如何单独执行某条规则?

   make + 你想得到的目标,make默认执行第一条规则

     

2. 如果用户没有指定执行某一条规则,直接运行make命令会默认执行makefile中的1条规则,而这条规则中的目标称之为:最终目标

clean通常是用来清除一些我们产生的中间文件:

2.4 Makefile规则-变量 (简化Makefile)

使用变量前:

app1: app1.o func1.o func2.o

    gcc app1.o func1.o func2.o -o app1

app2: app2.o func1.o func2.o

    gcc app2.o func1.o func2.o -o app2

使用变量后:

obj=func1.o func2.o (变量赋值没有空格)

app1: app1.o $(obj) (引用变量:$(obj)

    gcc app1.o $(obj) -o app1

app2: app2.o $(obj)

    gcc app2.o $(obj) -o app2

注:在一个Makefile中多出出现的组成部分,可以使用变量来替换;在Makefile中变量是没有类型的。

makefile中,用户除了可以自己定义变量外,还可以直接使用系统已经定义好的默认变量:

$<:代表第一个依赖文件

    $^代表所有的依赖文件

$@:代表目标集合

% :模式匹配符(%.o表示当前目录下的所有.o文件)

使用前:

led.o : led.S

    arm-linux-gcc -g o led.o -c led.S

使用后:

led.o : led.S

    arm-linux-gcc -g o $@ -c $^

 

2.5 Makefile构成-通用规则

当一个makefile中有许多类似的规则时,如何将这些规则合并为一条通用规则?

目标的名字依赖的名字仅仅是后缀不一样,如下图:

我们可以用%修改;%表示任意的名字

注:Makefile中“#字符后的内容被视作注释。

 

3.Makefile使用技巧

3.1 使用技巧-使用伪目标指令烧写程序到sd卡

3.2 使用技巧-去回显(在编译大源代码的时候非常有用,回显占用编译时间)

hello: hello.c

    @gcc hello.c o hello

在命令前面加@:取消回显

3.3 使用技巧-文件名

make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:make f 文件名

Makefile — 基础的更多相关文章

  1. Makefile基础---编译

    首先写一个自己的库: #include "../MyAPI.h" #include <cstdlib> #include <ctime> int getRa ...

  2. Makefile基础学习

    Makefile基础学习 理论知识 makefile关系到了整个工程的编译规则.一个工程中的源文件不计其数,并且按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文 ...

  3. Makefile基础(三)

    第一章:C语言之Makefile基础(一) 第二章:C语言之Makefile基础(二) 再来看一个简单的例子: [root@localhost linux_c]# cat Makefile foo = ...

  4. Makefile基础(二)

    上一章:C语言之Makefile基础(一) 上一章的Makefile写的中规中矩,比较繁琐,是为了讲清楚基本概念,其实Makefile有很多灵活的写法,可以写的更简洁,同时减少出错的可能 一个目标依赖 ...

  5. Linux学习二:Makefile基础

    文首感谢http://www.chinaunix.net 作者:gunguymadman的分享 makefile关系到了整个工程的编译规则.一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个 ...

  6. 5、Makefile基础知识汇总(转自陈皓总述)

    一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或多的的目标文件.这是由Makefile ...

  7. [转] Makefile 基础 (5) —— Makefile 使用变量

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  8. [转] Makefile 基础 (4) —— Makefile 书写命令

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  9. [转] Makefile 基础 (2) —— Makefile 总述

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  10. [转] Makefile 基础 (1) —— Makefile 介绍

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

随机推荐

  1. elasticsearch集群内部节点超时解决

    默认配置为:节点每隔1s同master发送1次心跳,超时时间为30s,测试次数为3次,超过3次,则认为该节点同master已经脱离了.以上为elasticsearch的默认配置.在实际生产环境中,每隔 ...

  2. js 基础对象一

    JavaScript 通常用于操作 HTML 元素. Document元素 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页 ...

  3. Java 多态,重载,重写

    1.多态(polymorphism): 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象, ...

  4. 转:LoadRunner常用函数列表

    Web相关函数 函    数 功 能 描 述 web_custom_request 用户可以通过该函数自行创建一个HTTP请求的函数 web_image 模拟用户单击图片操作的函数 web_link ...

  5. OpenCart之联系我们contact us页面提交时邮件错误

    许多OpenCart系统的用户都发现联系我们contact us页面提交时发生错误.本页发生错误是正常的,原因如下: 1. 你设定了SMTP,因此SMTP默认是从你设置的SMTP的email账户中发出 ...

  6. WiresShark 使用方法

    Wireshark(前称Ethereal)是一款功能强大的网络抓包分析工具,在我的工作中是不可或缺的一部分工具,往往在网络出现异常时,查看网络中的数据包,会豁然开朗.1.菜单栏  主菜单包括以下几个项 ...

  7. vm lxc

    taxonomy, 有4种: 进程虚拟机:1.相同指令集(wine),2.不同指令集(java)系统虚拟机:3.相同指令集(kvm),4.不同指令集(qemu) 第4种又可分为直接运行于硬件之上(xe ...

  8. ZOJ 3939The Lucky Week<模拟/暴力>

    题意:我们认为日期的天数为1,11,21,并且是周一的为Lucky Week;现在给出第一个lucky week的日期,求第N个的lucky week: //1:四百年一轮回,从闰年和平年的判定可以推 ...

  9. HRBUST 1909 理工门外的树(双数组实现线段树功能)

    线段树固然可以做,但是在考虑线段树之前应该先考虑一下,这种用两个数组来解决问题的方法能不能行,如果行的话,就会为我们省很多时间,毕竟线段树代码量比较大 #include<iostream> ...

  10. android4.0 的图库Gallery2代码分析(二)

    最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...