1、为什么需要Makefile?

  利用Makefile和make的合作,可以把很多很多的工作合并成一个非常简单的命令:make;

  make能够使整个程序的编译、链接只需要一个命令(make)就可以完成;

  

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

2、Makefile构成规则

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

  target : prerequisites

    command

  目标 : 依赖

    命令

  特别注意:命令需要使用【TAB】键空格

  

  范例:

  led.elf:led.o

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

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

  .PHONT:clean

  clean:

    rm -f hello main.o func.o

  ".PHONY"将"clean"目标声明为伪目标

3、Makefile构成—最终目标

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

    make(空格)目标的名字

  (2)如果用户没有指定执行某一条规则,make会默认执行Makefile中的第一条规则,而这条规则中的目标称之为:最终目标;

  

4、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)

  gcc app1.o $(obj) -o app1

app2 : app2.o $(obj)

  gcc app2.o $(obj) -o app2

在一个Makefile中,多次出现的组成部分,可以使用变量进行替换;

Makefile中,变量没有类型,不需要去定义它,直接赋值就可以了;

变量的名字是可以随便取的;

obj是变量名,紧接着是赋值号=,左右两边不要有空格,在Makefile中不允许有这样的空格;

给变量赋值时,直接变量名,赋值号就可以了;

但是当我们引用这个变量时,要用$(变量名)

在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量。

$^:代表所有的依赖文件

$@:代表目标

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

使用前:

led.o : led.S

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

使用后:

led.o : led.S

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

5、Makefile构成—通用规则

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

  %.o : %.S

使用前:

led.o : led.S

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

main.o : main.S

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

func.o : func.S

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

特点:命令一样,目标的名字与依赖的名字仅仅是后缀不一样

就可以写成:

%.o : %.S

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

%表示任意的两个相同的名字名字

6、Makefile使用技巧—去回显

  去回显:节省时间

  回显:执行命令时,会打印出命令

  比如执行make clean,会打印出:rm *.o *.bin *.elf

  方法:在命令前加@符号!

  func.o : func.S

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

7、Makefile使用技巧—文件名

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

  make -f 文件名

  整体运行时,运行命令:make -f 文件名

  单独执行某条指令时:例如执行make clean,应写为:make -f 文件名 clean

  

  

017Makefile工程管理的更多相关文章

  1. 使用BLADE构建c++工程管理

    使用BLADE构建c++工程管理 字数764 阅读2753 评论2 喜欢4 一. c++工程依赖管理 之前在百度一直使用comake2构建c++项目,十分方便.免去了手写Makefile的痛苦,很多项 ...

  2. emacs工程管理,cedet ede插件自动构建Make,Automake

    鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用G ...

  3. Makefile 工程管理

    Makefile 工程管理 Makefile 规则 --变量 在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量 $^:代表所有的依赖文件 $@:代表目标 $&l ...

  4. make工程管理器

    1.概述 大型程序中,人们希望工具自动识别修改的文件,而且不需要输入冗长的命令,就可以进行编译链接等操作,于是make工程管理器应运而生. make可以自动识别文件时间戳,只处理修改的文件: make ...

  5. 学习总结:工程管理与makefile

    工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...

  6. Go语言 函数,工程管理

    Go语言 函数,工程管理 1.无参无返回值函数的使用 package main import "fmt" func main() { // 无参无返回值函数的调用:函数名() fu ...

  7. go语言基础之工程管理和工作区介绍

    1.工程管理 在实际的开发工作中,直接调用编译器进行编译和链接的场景是少而又少,因为在工程中不会简单到只有一个源代码文件,且源文件之间会有相互的依赖关系.如果这样一个文件一个文件逐步编译,那不亚于一场 ...

  8. RTT工程管理

    一.RTT工程管理 RTT采用SCons管理工程. 本次安装版本:Python-2.7.3.1.exe,python-2.7.11.msi,scons-2.3.1-setup.exe 安装完成后,需要 ...

  9. Qt工程管理

    Qt Creator工程管理Qt Creator以工程项目的方式对源码进行管理一个Qt Creator工程包含不同类型的文件 .pro项目描述文件.pro.user用户配置描述文件 //由Qt Cre ...

随机推荐

  1. centos6.5安装配置fastdfs+nginx实现分布式图片服务器

    一.准备 yum groupinstall -y "Development Tools"yum install -y wget libevent-devel pcre-devel ...

  2. bug_ _java.lang.IllegalArgumentException: View not attached to window manager 2

    今天遇到一个很奇特的问题,当用户设置了PIN码,在锁屏界面正常解锁PIN码后,进入Launcher时显示com.android.phone 已停止运行.一开始猜想会不会是解锁PIN码的时候处理导致了P ...

  3. Xcode5创建自己的静态库详解

    首先声明: 本人屌丝一枚,如有不对不妥之处,请大牛指正! 1.静态库工程的建立: Xcode New一个新的project,选择IOS下面的Framework&Library,下面有一个Coc ...

  4. [C语言](二)01 获取Windows图形构件大小信息

    SYSMETS.c #include <windows.h> #include "SYSMETS.H"//自定义的单元,所以用"",不是用<& ...

  5. Python进阶02 文本文件的输入输出

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python具有基本的文本文件读写功能.Python的标准库提供有更丰富的读写功能 ...

  6. ubuntu14.04 彻底重装mysql&phpmyadmin

    ---恢复内容开始--- 因为很久没用mysql,突然发现密码忘记了,折腾半天后,怎么也改不会来了!再此记一下,彻底重新删除再安装的过程. step1. 卸载: sudo apt-get remove ...

  7. 关于Objective-C 对象release操作的一个小问题探讨

    来源:http://blog.csdn.net/duxinfeng2010/article/details/8757211 最近遇到这样一个问题,以前的时候并未注意:新建一个工程,然后添加一个类,文件 ...

  8. C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符

    在程序中一般用cout和插入运算符“<<”实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员 ...

  9. 将Word文档发给别人时如何限制别人只能修改文档部分内容

    将Word文档发给别人时如何限制别人只能修改文档部分内容  转自:互联网.时间:2014-04-16   作者:snow   来源:互联网 在很多情况下我们都不希望别人修改我们的文档内容,特别实在将W ...

  10. jquery mobile转场时加载js失效(转)

    jquery mobile拦截了所有的http请求,并使用ajax请求取代传统的http.请求发出后,框架会将请求的内容插入到页面中data- role="page"的部分,取代原 ...