Makefile工程管理语法与使用技巧




  

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

  

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


     Makefile中最重要的组成部分是“规则”
规则:
用于说明如何生成目标文件,规则的格式如下:
targets prerequisites
    command
目标 依赖 命令
特别提供:命令需要使用【
TAB】键空格

    目标?依赖?命令?

例如:
led.bin: led.o
    arm-linux-ld -Tled.lds -o led.elf led.o


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

.PHONY : clean\

clean:

    rm -rf  hello main,o func.o

其中.PHONY  的作用是将clean生成为伪目标


最终目标:

1.当一个makefile中有多条规则时,如何单独执行某条
规则?make后面加某一个规则的目标
2. 如果用户没有指定执行某一条规则,make会默认
执行
makefile中的第1条规则,而这条规则中的目标称之
为:
最终目标


变量:

使用变量前:
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中,用户除了可以自己定义变量外,还可以使用
存在
系统已经定义好的默认变量。
1. $^:代表所有的依赖文件
2, $@:代表目标
3. $<:代表第一个依赖文件

使用前:
led.o : led.S
    arm-linux-gcc -g –o led.o -c led.S

使用后

led.o : led.S

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


通用规则:

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

    


例如:

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

key.o : key.S
    arm-linux-gcc -g –o key.o -c key.S

uart.o : uart.S
    arm-linux-gcc -g –o uart.o -c uart.S

上面三个规则中目标和依赖只有后缀不一样,那么我们可以用%代替前缀

%.o : %.S

    arm-linux-gcc -g –o %.o -c %.S

就代替了上面三个规则,简单实用.


 为了节省时间,有时候我们需要去掉回显,在命令前加一个@符号,就可以去掉该命令的回显功能.例如:

hello: hello.c
    @gcc hello.c –o hello
@:
取消回显 (演示)

    

文件名:

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

         

          make -f 文件名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUC 知识总结

在 ThreadPoolExecutor 里面定义了 4 种 handler 策略&#xff0c;分别是 1. CallerRunsPolicy &#xff1a;这个策略重试添加当前的任务&#xff0c;他会自动重复调用 execute() 方法&#xff0c;直到成功。 2. AbortPolicy &#xff1a;对拒绝任务抛弃处理&#xff0c;并且…

C# java 有关“字节序”的描述 .

有关“字节序”的描述 收藏 BIG-ENDIAN&#xff08;大字节序、高字节序&#xff09; LITTLE-ENDIAN&#xff08;小字节序、低字节序&#xff09; 主机字节序 网络字节顺序 JAVA字节序 1&#xff0e;BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关的比如int,short,long型&…

移植u-boot-2012.04.01到jz2440开发板

今天我给大家分享一下如何移植一个纯净的uboot到jz2440开发大版&#xff0c;通过记录学习分享&#xff0c;与大家一起进步&#xff01;&#xff01;&#xff01; 1.首先我们在uboot官网下载u-boot-2012.04.01.tar.bz2&#xff0c;建立source insight工程。将下载好的uboot通过…

温习了一下java线程状态方面的知识总结一

好长时间没有复习线程状态这块&#xff0c;读并发编程实战正好看着这块&#xff0c;顺便复习一下&#xff1a; 1.线程的五种状态&#xff1a; 2.线程五种状态的转换图&#xff1a; wait()会立刻释放synchronized(obj)中的锁以便其它线程可以执行obj.notify 但是notify() 不会立…

WinForm:进度条的实现(异步)

在WinForm中经常遇到一些费时的操作界面&#xff0c;比如统计某个磁盘分区的文件夹或者文件数目&#xff0c;如果分区很大或者文件过多的话&#xff0c;处理不好就会造成“假死”的情况&#xff0c;或者报“线程间操作无效”的异常&#xff0c;为了解决这个问题&#xff0c;可以…

移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动

上一篇文章我们已经修改了uboot源码使其能够正常打印输出了&#xff0c;但是输出停到了nand启动那里&#xff0c;所以这篇文章就来记录如何修改源码使uboot支持NAND启动。 原来的代码在链接时加了”-pie”选项, 使得u-boot.bin里多了”(.rel)”, “*(.dynsym)”使得程序非常大…

XMLHttpRequest() 请求 返回结果JSON 对象与JSON 字符串处理

好久没有看JavaWEB项目了突然拿起来&#xff0c;而且是原生的项目&#xff0c;中JSON 字符串的处理 json.stingfy() 将对象&#xff0c;数组转换为字符串&#xff0c;json.parse() 将字符串转成json 对象JSON.stringify&#xff08;数组或者对象&#xff09; JSON.parse(字符串…

【C++深度剖析教程4】C++的二阶构造模式

今天学习的是C中的二阶构造模式&#xff0c;二阶构造模式只是设计模式中的简单的模式&#xff0c;是一种软件设计的方法&#xff0c;并没有我们想象的那么高深&#xff0c;设计模式也是一样&#xff0c;只不过是一系列的设计方法&#xff0c;只要我们懂得了原理&#xff0c;那么…

获取应用程序根路径

public string GetRootURI(){string UrlAuthority Request.Url.GetLeftPart(UriPartial.Authority);if (Request.ApplicationPath null || Request.ApplicationPath "/"){//直接安装在Web站点return UrlAuthority;}else{//安装在虚拟子目录下return UrlAuthority …

JQuery 中选择多选择框,和单选框,实现获取相应选择的值

好久没有弄前端了&#xff0c;还是记一下&#xff1a;建议大家学习时&#xff0c;深入学习一样知识&#xff0c;可以涉猎很多 获取单选按钮的值&#xff1a; $(document).ready(function() { $.ajax({//url:base_url"/login/login.do",url:"url地址",type…

【C++深度剖析教程5】C++中类的静态成员函数

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交流资源…

Lucene:基于Java的全文检索引擎简介

(转自http://hi.baidu.com/sz_xiaofeng/blog/item/7f3c33ed033444d1b31cb1b2.html)Lucene是一个基于Java的全文索引工具包。 基于Java的全文索引引擎Lucene简介&#xff1a;关于作者和Lucene的历史全文检索的实现&#xff1a;Luene全文索引和数据库索引的比较中文切分词机制简介…

eclipse 工程中使用引入maven项目遇到maven-resources-plugin:2.6 找不到

1.开始eclipse 配置本地库 首先是从maven 官网下载maven 组件 其次是配置 maven 环境和java 配置jdk 类似这里就不做介绍了 配置完环境后修改\apache-maven-3.3.9\conf\settings.xml 中的<localRepository> 设置本地仓库 然后配置eclipse 下面图中执行较为重要&#xff…

移植uboot之修改代码支持NorFlash记录

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天我们的任务是修改uboot源码支持NorFlash。 上两篇关于uboot移植的文章&#xff0c;我们修改了uboot源代码&#xff0c;支持了串口的输出&#xff…

保持一颗好学之心

保持一颗好学之心 初见这个题目&#xff0c;许多人可能会对自己相当满意&#xff1a;“我还是很好学的”。真的是这样吗&#xff1f;个人之见&#xff0c;有不少人其实并不像他们想象的那么好学&#xff0c;尤其是那些有了一定经验&#xff0c;在某些方面有些过人之处的“聪明”…

Vue.js 学习

后端和数据库角色&#xff0c;确参加了前端培训&#xff0c;哪就总结一下&#xff1a;后续继续更新 1.首先是vue.js 与jquery 的比较 vue.js 是采用数据和dom元素分类&#xff0c;采用的VMMV 模式 V view 视图 M Model 存放数据&#xff0c;VM 在M和V 主要是处理一些业务逻辑…

移植uboot之修改代码支持NorFlash记录续集

接着上一篇文章写的内容&#xff08;上一篇文章链接&#xff1a;移植uboot之修改代码支持NORFLASH&#xff09;&#xff0c;上一篇结尾测试flash的擦除读写功能&#xff0c;结果无法写flash&#xff0c;卡在了这里&#xff1a; 前面已经擦除成功&#xff0c;这里写内容写不进…

C#开发终端式短信的原理和方法

本文示例源代码或素材下载 简介 没发过短信的年轻人肯定是属于那种受保护的稀有动物&#xff0c;通讯发达的今天短信已经成为人们交流的重要手段&#xff0c;其中也蕴含着巨大的市场和经济利益&#xff0c;掌握短信技术的人才也受到各大公司的追捧是目前职场上耀眼的明星。本文…

移植uboot之修改代码支持NorFlash记录续集二

先说一个事&#xff1a;我会在最后把移植好的uboot&#xff0c;内核&#xff0c;分别做一个补丁文件&#xff0c;以后如果用到相同的uboot以及内核都可以直接下载我这个补丁进行打补丁操作就可以直接用~ 上一个移植uboot续集&#xff0c;我们解决了无法写flash的问题&#xff…

Mysql function(函数)

1.mysql 拼接函数 1. 1CONCAT(string1,string2,…) 说明 : string1,string2代表字符串,concat函数在连接字符串的时候&#xff0c;只要其中一个是NULL,那么将返回NULL 1.2 CONCAT_WS(separator,str1,str2,...)说明 : string1,string2代表字符串,concat_ws 代表 conca…