makefile常用讲解(2)

From: http://www.cnblogs.com/mydomain/archive/2011/08/12/2136085.html

 

4)变量的引入

变量的引入和应用:

CC=gcc

HD=-I headers

SC=-c $<

OBJ=-o $@

bin/st_work : obj/main.o  obj/st_work.o  obj/fun.o  

gcc  $^  -o $@  (命令一定要用以Tab开头)

obj/st_work.o : sources/st_work.c

$(CC) $(HD) $(SC) $(OBJ)

obj/main.o : sources/main.c

$(CC) $(HD) $(SC) $(OBJ)

obj/fun.o  : sources/fun.c

$(CC) $(HD) $(SC) $(OBJ)

clean:

rm -f bin/st_work file_o/*.o

可以看到,依赖关系由上到下。

More:

(1)如此定义变量后,

objects = main.o,

foo = $(bar)

使用$(object)来代替变量的值,用“$$”来表示$。

(2)变量替换

其格式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。

foo := a.o b.o c.o

bar := $(foo:.o=.c)

(3)变量可以嵌套

$($(x))

    (4)可以使用“+=”操作符给变量追加值。

    (5)当make嵌套调用时,上层Makefile中定义的变量会以系统环境变量的方式传递到下层的Makefile中。这里的系统环境变量与本makefile中定义的变量的关系有点类似于全局变量与局部变量的关系。默认情况下,只有通过命令行设置的变量会被传递。而定义在文件中的变量,如果要向下层Makefile传递,则需要使用exprot关键字来声明。

5)信息显示

在执行make时,会把所有这些信息都输出来。

在命令前面加个@,就不会把相关信息输出屏幕了。

6)函数的使用

函数调用后,函数的返回值可以当做变量来使用。

调用格式如下所示:  $(<function> <arguments>;)

函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。参数可以使用变量。

bar:= $(subst $(space),$(comma),$(foo))

上面的函数subst是把第三个参数中包含第一个参数中的字串替换成第二个参数中的字串。

7)语句的使用

    $(if <condition>;,<then-part>;) 

    $(if <condition>;,<then-part>;,<else-part>;)

    make支持三各通配符:“*”,“?”和“[...]”。波浪号“~”字符在文件名中也有比较特殊的用途。如果是“~/test”,这就表示当前用户的$HOME目录下的test目录。而“~hchen/test”则表示用户hchen的宿主目录下的test目录

5、其他注意点

1)在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,通常要给中间目标文件打个包,在Windows 下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX 下,是Archive File,也就是 .a 文件。

    编译阶段,主要解决语法问题,如函数,变量等声明是否正确,而链接阶段,因为要生成可执行文件了,要明确具体的地址关系,及寻找真实的定义等。

2)将长行用 “\” 分开便于阅读。

3)和目标没有依赖关系的规则不会被处理,除非指定make 处理(如make clean)。

4)将源文件分门别类地放置时,编译时要进行寻找。通过VPATH实现。

    如果没有指明这个变量,make 只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。

VPATH = src:../headers

多个目录使用:分开

另外一个vpath,不是变量,使用方法如下:

它可以指定不同的文件在不同的搜索目录中。使用方法有三种:

(1)vpath <pattern> <directories>。为符合模式<pattern>的文件指定搜索目录<directories>。

(2)vpath <pattern>。清除符合模式<pattern>的文件的搜索目录。

(3)vpath。清除所有已被设置好了的文件搜索目录。

    <pattern>需要包含“%”字符。“%”的意思是匹配零或若干字符,例如,“%.h”表示所有以“.h”结尾的文件。<pattern>指定了要搜索的文件集,而<directories>则指定了<pattern>的文件集的搜索的目录。例如:

    vpath %.h ../headers

该语句表示,要求make 在“../headers”目录下搜索所有以“.h”结尾的文件。

5)有些情况下,则规则失效,没有依赖文件,文件clean命令永远不会执行;为避免这个问题,可使用".PHONY"指明该目标。如:

    .PHONY : clean

这样,在make clean是会无视clean是否存在,直接执行其命令。

    与上面等效的另外一个表达:

clean: FORCE

    rm $(objects)

    FORCE:

6)此外,还有很少使用的双冒号规则。

7)使用include关键字可以把别的Makefile包含进来。

 

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

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

相关文章

router-link

组件的属性有&#xff1a; to 、replace、 append、 tag、 active-class、 exact 、 event、 exact-active-class to&#xff08;必选参数&#xff09;&#xff1a;类型string/location 表示目标路由的链接&#xff0c;该值可以是一个字符串&#xff0c;也可以是动态绑定的描…

Qt编程'hello world

#include<QApplication>#include<QLabel>int main(int argc,char*argv[]){QApplicatin app(argc,argv);QLabel *label("hello");label->show();return app.exec()} 编译运行&#xff1a; qmake -project 生成 .pro文件qmake 生成 makemake执行 转载于…

电子工程师必上的十大专业网站

这是很久以前看过的帖子&#xff0c;感觉非常不错&#xff0c;今天特地找出来&#xff0c;便于自己以后经常翻阅&#xff01;&#xff01;今天再看这篇文章&#xff0c;发现很多网站自己还是没有账号&#xff0c;原来自己还是非常的不进取啊。来源&#xff1a;hi.baidu.com 作者…

Makefile文件编写规则

From: http://aviva.iteye.com/blog/807494 Makefile中包含五种内容&#xff1a;显式规则&#xff0c;隐式规则&#xff0c;变量定义&#xff0c;指令&#xff08;directive&#xff09;和注释。 1.显式规则――描述如何生成规则的目标&#xff0c;它列出了目标依赖的文件&…

vue使用better-scroll实现下拉刷新、上拉加载

本文目的是为了实现列表的下拉刷新、上拉加载&#xff0c;所以选择了better-scroll这个库。 用好这个库&#xff0c;需要理解下面说明 必须包含两个大的div&#xff0c;外层和内层div 外层div设置可视的大小(宽或者高)-有限制宽或高 内层div&#xff0c;包裹整个可以滚动的部分…

OpenCV学习 4:摄像头视频读写与边缘检测

原创文章&#xff0c;欢迎转载&#xff0c;转载请注明出处 想实现人脸识别&#xff0c;车辆识别&#xff0c;车牌识别。一般我们可不是读硬盘里面的视频文件的&#xff0c;都是直接从摄像头读取视频流然后直接识别的。所以读取摄像头的视频流这是基础。。。OpenCV对读取摄像头的…

Linux中自带正则表达式应用举例

环境&#xff1a;Fedora12, C程序&#xff1a; #include <stdio.h> #include <string.h> #include <sys/types.h> #include <regex.h>// 提取子串 char* getsubstr(char *s, regmatch_t *pmatch) {static char buf[100] {0};memset(buf, 0, sizeof(b…

ISAPI_Rewrite 规则说明

I (ignore case&#xff09;不管大小写强行指定字符匹配例&#xff1a;RewriteRule /code/project/([0-9,a-z]*).html /soft.jsp\?softpy$1 [I]其他的参数一览I (ignore case&#xff09;不管大小写强行指定字符匹配&#xff0c;这个FLAG影响RewriteRule指令和相应的RewriteCo…

H5页面唤起指定app或跳转到应用市场

场景1&#xff1a; 在 h5 页面上&#xff0c;不管用户是否安装过该app&#xff0c;都直接跳转到应用市场&#xff0c;让用户从应用市场上打开app。 思路&#xff1a; 这种场景处理比较简单&#xff0c;直接判断判断是android端还是ios端&#xff0c;然后在点击按钮上赋值对应…

MyBatis.Net 学习手记

MyBatis.NET的前身为IBatis&#xff0c;是JAVA版MyBatis在.NET平台上的翻版&#xff0c;相对NHibernate、EntityFramework等重量级ORM框架而言&#xff0c;MyBatis.NET必须由开发人员手动写SQL&#xff0c;相对灵活性更大&#xff0c;更容易保证DB访问的性能&#xff0c;适用开…

Python 使用 UTF-8 编码

From: http://blog.chenlb.com/2010/01/python-use-utf-8.html 一般我喜欢用 utf-8 编码&#xff0c;在 python 怎么使用呢&#xff1f; 1、在 python 源码文件中用 utf-8 文字。一般会报错&#xff0c;如下&#xff1a; File "F:\workspace\psh\src\test.py", line …

curl下载文件的命令

curl文件下载 curl将下载文件输出到stdout&#xff0c;将进度信息输出到stderr&#xff0c;不显示进度信息使用–silent 选项。1 . curl URL --silent 这条命令是将下载文件输出到终端&#xff0c;所有下载的数据都被写入到stdout。2 . curl URL --silent -O 使用选项 -O 将下载…

后台运行python程序 遇到缓冲区问题

From: http://www.iteye.com/topic/867446 环境&#xff1a;linux 一段执行时间很长的程序&#xff08;用python做hive客户端执行mapreduce&#xff09; 在linux后台执行&#xff0c;把结果输出到某文件&#xff1a; Python代码 python xxx.py > log.log& 遇到的问题…

[nodejs][html5][css3][js] 个人网站上线

各个功能详细代码 http://www.cnblogs.com/wangxinsheng/p/4263591.html 2015年1月31日 --- 虽然比较懒&#xff0c;但终于匆忙的弄了个个人网站上线&#xff0c;没有博客功能。。。只有些数据抓取&#xff0c;百度地图&#xff0c;视屏游戏功能。 可是heroku站点在国内的速度超…

各种URL生成方式的性能对比

在上一篇文章中我们列举了各种URL生成的方式&#xff0c;其中大致可以分为三类&#xff1a; 直接拼接字符串&#xff08;方法一及方法二&#xff09; 使用Route规则生成URL&#xff08;方法三&#xff09; 使用Lambda表达式生成URL&#xff08;方法四及方法五&#xff09; 我们…

element-ui中el-table的表头、内容样式

方式1&#xff1a; 直接在标签上添加上属性值&#xff1a; <el-table:header-cell-style"{background:#F3F4F7,color:#555}" ></el-table>方式2&#xff1a; 在method里面写上方法&#xff1a; rowClass({ row, rowIndex}) {console.log(rowIndex) //表…