017Makefile工程管理

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中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量。

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

[email protected]:代表目标

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

使用前:

led.o : led.S

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

使用后:

led.o : led.S

  arm-linux-gcc -g -o [email protected] -c $^

5、Makefile构成—通用规则

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

  %.o : %.S

使用前:

led.o : led.S

  arm-linux-gcc -g -o [email protected] -c $^

main.o : main.S

  arm-linux-gcc -g -o [email protected] -c $^

func.o : func.S

  arm-linux-gcc -g -o [email protected] -c $^

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

就可以写成:

%.o : %.S

  arm-linux-gcc -g -o [email protected] -c $^

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

6、Makefile使用技巧—去回显

  去回显:节省时间

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

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

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

  func.o : func.S

    @arm-linux-gcc -g -o [email protected] -c $^

7、Makefile使用技巧—文件名

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

  make -f 文件名

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

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

  

  

时间: 2024-12-14 18:44:32

017Makefile工程管理的相关文章

嵌入式linux QT开发(四)——QT Creator工程管理

嵌入式linux QT开发(四)--QT Creator工程管理 一.QT Creator工程管理 QT Creator以工程项目的方式对源码进行管理,一个QT工程中包含不同类型的文件如下: A..pro项目描述文件 B..pro.user用户描述文件 C..h头文件 D..cpp源文件 E..ui界面描述文件 F.资源文件(图片.音频等) 二..pro项目描述文件 1..pro项目描述文件基本构成如下: A.#注释起始符 B.QT模块声明 C.TARGET可执行文件名 D.TEMPLATE程序

RTT工程管理

一.RTT工程管理 RTT采用SCons管理工程. 本次安装版本:Python-2.7.3.1.exe,python-2.7.11.msi,scons-2.3.1-setup.exe 安装完成后,需要在环境变量中添加PATH(C:\Python27\Scripts). 可用cmd下scons验证是否安装正确. scons通过sconscript和sconstruct文件来组织源码结构,通常一个项目只有一个说construct,但是有多个sconscript. 1.RTT的配置是通过rtconfi

中国科学院大学工程管理与信息技术学院 2014年招收以下八个领域在职工程硕

中国科学院大学工程管理与信息技术学院2014年招收以下八个领域在职工程硕士,欢迎广大考生报考. 一.专业领域介绍 招生领域 研究方向 学费 报考条件 学位/证书 学习方式 项目管理 工程管理 IT项目管理 金融管理 大数据项目管理 4.3万 2011年7月31日前获得学士学位或2010年7月31日前获得国民教育序列大学本科毕业证书的在职工程技术或工程管理人员,或从事工程技术与工程管理教学的教师. 1.国务院学位办批准授予的工程硕士学位证书 2.高级职业资格证书/相应领域国际认证证书. 针对北京及

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

使用BLADE构建c++工程管理 字数764 阅读2753 评论2 喜欢4 一. c++工程依赖管理 之前在百度一直使用comake2构建c++项目,十分方便.免去了手写Makefile的痛苦,很多项目都不需要从零开始,其中的一个配置类似如下: WORKROOT('../../../')CopyUsingHardLink(True)CPPFLAGS('-D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DVERSION=\\"1.9.8.7\\"')CFLAGS(

3.Makefile工程管理

3.Makefile工程管理 一.体验 在前面的笔记里可以看到,要编译一个简单的工程需要的编译步骤是很多的.前面还是只有一个汇编文件,在一个工程里,会有很多文件的,如果像前面的那种编译方式是很不可靠的.这就需要Makefile工程管理. 例如前面的那个led.S,要编译成led.bin的步骤:图1-1: arm-linux-gcc -g -c led.S arm-linux-ld -Tled.lds -o led.elf led.o arm-linux-objcopy -O binary led

基于WebForm+EasyUI的工程管理系统形成之旅 -- 首页快捷方式

上篇<基于WebForm+EasyUI的工程管理系统形成之旅 -- 登录窗口>,主要是介绍系统登录界面页面设计与代码. 最近刚做完施工计划安排设计,之后将分享出来,这个系列更新不是很快,望大家多多体谅. 1.首页快捷方式 首页快捷方式,如下图所示. 点击[添加新的快捷方式],将所有页面以快捷方式呈现,如下图所示 双击添加快捷方式到首页.

基于WebForm+EasyUI的工程管理系统形成之旅 -- 登录窗口

上篇<基于WebForm+EasyUI的工程管理系统形成之旅 -- 登录设置>,主要是介绍系统浏览器及压缩图片工具在线下载安装,这些前期准备是非常重要的. 最近忙于将工程管理系统中各个模块,用业务流程方式串接起来,可能更新博客不是那么快,希望大家多多体谅. 1.登录界面 系统登录界面,如下界面所示. 基于WebForm+EasyUI的工程管理系统形成之旅 -- 登录窗口

自省:工程管理

1.统一格式.统一风格. 2.禁止. 自省:工程管理,码迷,mamicode.com

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

鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用GNU C写了一个简单的多线程,阻塞EchoServer.工程的代码倒是不多,就是基于原生API开发,总是有很多的errcode需要处理,比较的烦.所以我干脆就直接写了个宏去处理,简单的输出strerrno(errno)和errno就好.虽然这个宏实现起来比较的简单,但是还是感觉比较的值,节省了不少的