linux程序设计——make命令和makefile文件(第九章)

9.2 make命令和makefile文件

9.2.3 makefile文件中的注释

makefile文件中的注释以#号开头,一直延续到这一行的结束.和C语言的源文件注释一样,makefile文件中的注释可以帮助程序的编写者以及其他人理解最初编写这个文件的目的.

9.2.4 makefile文件中的宏

mkaefile文件允许使用宏以一种更通用的格式来书写它们.

通过语句MACRONAME=value在makefile文件中定义宏,引用宏的方法是使用$(MACRONAME)或${MACRONAME}.make的某些版本还接受$MACRONAME的用法.如果想把一个宏的值设置为空,可以令等号=后面为空.

makefile文件中的宏常被用于设置编译器的选项.在软件的开发过程中,通常开发人员不会对编译结果进行优化,而是将调试信息包含进去.但是对于软件的发行版,往往又需要反过来,即编译结果是一个不包含调试信息的容量较小的二进制可执行文件,使其执行速度尽可能快.

Makefile1文件的另一个问题是,它假设编译器的名字是gcc,而在其他UNIX系统中,编译器的名字可能是cc或c89.如果想要将makefile文件移植到另一个版本的UNIX系统中,或在现有的系统中使用另一个编译器,为了使其工作,将不得不修改makefile文件中许多行的内容.宏是用来收集所有这些与系统相关内容的好办法,通过使用宏定义,可以方便地修改这些内容.

宏通常是在makefile文件中定义的,也可以在调用make命令时在命令行上给出宏定义,例如命令make CC=c89.命令行上的宏定义将覆盖在makefile文件中的宏定义.当在makefile文件之外使用宏定义时,要注意宏定义必须以单个参数的形式传递,所以应避免在宏定义中使用空格或者给宏定义加引号.

编写Makefile2,它使用了一些宏定义

make命令将$(CC),$(CFLAGS)和$(INCLUDE)替换为相应的宏定义,这与C语言编译器对#define语句的处理方式很相似.

事实上,make命令内置了一些特殊的宏定义,通过使用它们,可以让makefile文件变得更加简洁.

宏        定义

$?        当前目录所依赖的文件列表中比当前目录文件还要新的文件

[email protected]        当前目录的名字

$<        当前依赖文件的名字

$*        不包括后缀名的当前依赖文件的名字

在makefile文件中,可能还会看到下面两个有用的特殊字符,它们出现在命令之前.

-:告诉make命令忽略所有错误.

@:告诉make在执行某条命令前不要将该命令显示在标准输出上.如果想用echo命令给出一些说明信息,这个字符将非常有用.

9.2.5 多个目标

通常制作不止一个目标文件或者多组命令集中到一个位置来执行是很有用的,可以通过扩展makefile文件来达到这一目的.下面的例子中,在makefile文件中增加一个clean选项来删除不需要的目标文件,增加一个install选项来将编译成功的应用程序安装到另一个目录下.

编写Makefile3

clean:
	-rm main.o 2.o 3.o

install: myapp
	@if [ -d $(INSTDIR) ]; 		then 		cp myapp $(INSTDIR);		chmod a+x $(INSTDIR)/myapp;		chmod og-w $(INSTDIR)/myapp;		echo "Installed in $(INSTDIR)";	else 		echo "Sorry, $(INSTDIR) does not exist";	fi

Makefile3中有几处需要注意(如上所示):

首先,特殊目标all仍然只指定了myapp这一个目标.因此,如果在执行make命令时未指定目标,它的默认行为就是创建目标myapp.

其次是两个新增的目标:clean和install.目标clean用rm命令来删除目标文件.rm命令以减号-开头,减号-的含义让make命令忽略rm命令的执行结果.这意味着,即使由于目标文件不存在而导致rm命令返回错误,命令make clean也会成功.用于制作目标clean的规则并未给目标clean定义任何依赖关系,行clean: 后面是空的,因此该目标总被认为是过时的,所以在执行make命令时,如果指定目标clean,则该目标所对应的规则将总被执行.

目标install依赖于myapp,所以make命令知道它必须首先创建myapp,然后才能执行制作该目标所需的其他命令.用于制作install目标的规则由几个shell脚本命令组成.由于make命令在执行规则时会调用一个shell,并且会针对每个规则使用一个新shell,所以必须在上面每行代码的结尾加上一个反斜杠\,让所有shell脚本命令在逻辑上处于同一行,并作为一个整体传递给一个shell执行.这个命令以符号@开头,表示make在执行这些规则之前不会在标准输出上显示命令本身.

目标install按顺序执行多个命令将应用程序安装到其最终位置.它并没有在执行下一个命令前检查前一个命令的执行是否成功.如果这点很重要,则可以将这些命令用符号&&连接起来.例如cp myapp (INSTDIR) \

&&对于shell而言,每个后续命令只在前面的命令都执行成功的前提下才被执行.

时间: 2025-01-31 06:41:26

linux程序设计——make命令和makefile文件(第九章)的相关文章

简介make命令和makefile文件

一.为什么要用到 make 命令和 makefile 文件 在 Linux 下编写一个程序,每次编译都需要在命令行一行一行的敲命令.如果是一个很小的程序还好说,命令不怎的复杂,编译速度也挺快,但是对于大型程序来说,这样无疑很麻烦,且不说可能会敲错命令,有时候仅仅改动了一个小地方,却需要将整个程序全部重新编译一遍,显然很浪费时间.Linux 提供了 make 命令来解决上述问题,它会在必要时重新编译所有受改动影响的源文件.同时,还提供了一个 makefile 文件,它告诉 make 命令如何构建应

Linux 程序设计学习笔记----ANSI C 文件I/O管理

转载请注明出处:http://blog.csdn.net/suool/article/details/38129201 问题引入 文件的种类 根据数据存储的方式不同,可以将文件分为文本文件和二进制文件.具体的区别和关系如下: 文本文件与二进制文件在计算机文件系统中的物理存储都是二进制的,也就是在物理存储方面没有区别都是01码,这个没有异议,他们的区别主要在逻辑存储上,也就是编码上. 文本文件格式存储时是将值作为字符然后存入其字符编码的二进制,文本文件用'字符'作为单位来表示和存储数据,比如对于1

Linux 如何通过命令查看一个文件的某几行(中间几行或最后几行)

linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1000 [二]显示1000行到3000行 cat filename | head -n 3000 | tail -n +1000 *注意两种方法的顺序 分解: tail -n 1000:显示最后1000行 tail -n +1000:从1000行开始显示,显示1000行以后的 head -n 100

linux中touch命令参数修改文件的时间戳(转)

linux中touch命令参数不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件,以下是linux中touch命令参数的使用方法: touch [-acm][-r ref_file(参照文件)|-t time(时间值)] file(文件名) example: touch file1.txt 更新file1.txt的存取和修改时间 touch -c file1.txt 如果file1.txt不存在,不创建文件 touch -r ref_file file1.t

gcc命令以及makefile文件

(一)makefile里涉及到的gcc命令 gcc -I./inc:指定头文件寻找目录 将按照 ./inc --> /usr/include --> /usr/local/include的顺序寻找头文件 gcc -L./lib:指定库文件的寻找目录 将按照 ./lib --> /usr/lib --> /usr/local/include的顺序寻找库文件 gcc -ltest 将使用libtest.so动态链接库或libtest.a静态链接库,优先使用libtest.so gcc

Linux 如何用命令查看binlog文件的创建时间

目录 背景 分析 方法 注意 背景 MySQL在26日 16:23:49产生了大量的慢查询,在这段时间内,binlog文件刷新的很快(查看慢日志是mysql DML并发比较多),想知道写完一个binlog文件究竟花了几分钟时间? 分析 三个binlog文件的最后修改间隔时间分别是2 分钟和1 分钟 同一个事务只能写同一个binlog文件 mysql-bin.016126文件的最后修改时间16:22不一定是mysql-bin.016127 文件创建的时间(存在大事务的情况下,大事务还在写上一个bi

Linux中通过命令直接删除文件中最后一行

何谓Sed(Stream EDitor): Sed原为UNIX系统上的非交谈式文字编辑器(non-interactive stream editor).当Sed读入待编辑文件,会依编辑命令来进行文件的编辑工作. sed -i '$d' file 如同其它UNIX的指令一般,Sed亦是由标准输入(standard input)读入欲编辑的文件,经Sed处理后,再由标准输出(standard output)送出结果.由于Sed是采逐行读入文字,并依据命令来进行编辑,因此可视作档案中的文字逐行通过Se

linux程序设计——进程和信号(第十一章)

11.4.1    发送信号 进程可以通过调用kill函数向包括它本身在内的其他进程发送一个信号.如果程序没有发送该信号的权限,对kill函数的调用就将失败,失败的常见原因是目标进程由另一个用户所拥有.这个函数和同名的shell命令完成相同的功能,它的定义如下所示: #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); kill函数把参数sig给定的信号发送给参数pid给出的进程号所指定的进

《Linux程序设计 第四版》之第二章的最后练习题

这篇文章是<Linux程序设计 第四版>中的第二章的最后练习题(2.8综合应用), 题目是编写一个CD数据库应用程序, 首先:用两个文件来保存存储的数据,一个是title_file.cdb,一个是column_file.cdb! title_file.cdb里面保存的是唱片的基本信息:拥有如下四个字段: CD的目录编号,标题,唱片类型,作曲家或艺术家: column_file.cdb里面保存的是唱片的详细信息即唱片包含的歌曲信息:拥有如下三个字段: CD的目录编号,曲目编号,歌曲名 其次: 有