make 用来解析 makefile 文件

make 的选项:
-d   显示调试信息
-f 文件  默认是从 makefile 或 Makefile 中读取依赖信息,用该选项可更改文件
-h   显示所有 makefile 的 help 信息
-n   显示 makefile 执行命令的顺序,但不执行
-s   运行时不显示任何信息

makefile 格式:

目标:依赖列表
<Tab>命令列表

目标通常是指要生成的文件的名称,可以使可执行文件或obj文件,也可以是一个执行的动作名称,如clean
。依赖是用来  产生目标  的材料,比如源文件,一个目标经常有多个依赖
命令是生成目标时执行的动作,一个规则可以含有几个命令,每个命令占一行

执行make clean时,由于clean没有依赖,所以它的命令将被强制执行
make clean中的 clean 是一个虚目标,一般用来删除 make 产生的文件

makefile 语法:

#  注释
\  连接符,前后不要有空格
?,*  通配符

例1. hello.c文件内容:

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. printf("Hello Linux!\n");
  5. return ;
  6. }

关于hello.c的 makefile 文件内容为:

  1. hello:hello.o
  2. gcc -o hello hello.o gcc hello.o -o hello
  3. hello.o:hello.c
  4. gcc -c -o hello.o hello.c gcc -c hello.c -o hello.o
  5.  
  6. clean:
  7. rm -f *.o

多文件时 makefile 编写:

例2.假如源文件 a.c 和 b.c 可生成可执行文件 test。其 makefile 文件内容为:

  1. test:a.o b.o
  2. gcc -o test a.o b.o gcc a.o b.o -o test
  3. a.o:a.c
  4. gcc -c -o a.o a.c gcc -c a.c -o a.o
  5. b.o:b.c
  6. gcc -c -o b.o b.c gcc -c b.c -o b.o
  7.  
  8. clean:
  9. rm -f *.o

make 只有在依赖比目标新的时候才会执行其后命令。可通过 touch 命令修改某文件时间。

makefile 中变量的 定义 方式为: 变量 := 值
makefile 给变量 增加 一个值为: 变量 += 值
makefile 中变量的 引用 方式为: $(变量名) 或 ${变量名}、$单字符变量

makefile 几种赋值及区别:

  :=  简单的赋值,如果变量已经有值,会覆盖旧值

  ?=  条件赋值,如果变量未定义,则赋值,如果变量已定义,无论其值空与否,均不赋值。

  +=  给已经赋值的变量后面添加一个值,原值依然包含在新值中。

例如:
C=gcc
$C

CC=gcc
$(CC) 或 ${CC}

例3:
用此方式,修改 例1 的 makefile 文件为:

  1. CC := gcc
  2. Objects := test.o
  3. Sources := test.c
  4. test:$(Objects)
  5. $(CC) -o test $(Objects)
  6. $(Objects):$(Sources)
  7. $(CC) -c -o $(Objects) $(Sources)
  8.  
  9. clean:
  10. rm -f *.o

makefile 中还可添加如下命令来进行打包:

tar:
 tar -cvf pack.tar makefile *.c *.h

执行 make tar 就可以将文件夹中所有 .c .h 还有 makefile 文件打包

makefile 中的内置变量:

$@  当前目标的名称
$^  所有依赖
$<  比当前目标更新的依赖。第一个依赖
$?  比当前目标更新的依赖 列表 。表示所有已修改的依赖文件

利用内置变量,修改 例3 的 makefile 文件为:

  1. CC := gcc
  2. Objects := test.o
  3. Sources := test.c
  4. test:$(Objects)
  5. $(CC) -o $@ $^
  6. $(Objects):$(Sources)
  7. $(CC) -c -o $@ $^
  8.  
  9. clean:
  10. rm -f *.o

注意:内置变量指代的内容是不固定的,是随上下文变化的。例如:
 abc:bcd
里面的目标为 abc ,依赖为 bcd。而
 hello:hello.c
里面的目标为 hello,依赖为 hello.c

还可以利用 makefile 默认的识别方式,用 %.c 表示所有 .c 文件,%.o 表示所有 .o 文件:
例如:改写 例2:

  1. test:a.o b.o
  2. gcc -o $@ $^ gcc $^ -o $@
  3. %.o:%.c
  4. gcc -c -o $@ $^ gcc -c $^ -o $@
  5.  
  6. clean:
  7. rm -f *.o

makefile 如果省略文件名,会默认将目标与依赖同名。此时,可省略依赖和命令。
例如:再次简化上例:

  1. test:a.o b.o
  2. gcc -o $@ $^ gcc $^ -o $@
  3. a.o:
  4. b.o:
  5.  
  6. clean:
  7. rm -f *.o

上面的
 a.o:  
 b.o:
两行可以简写成一行:
 %.o:

虚目标:

makefile 中有一些目标,它们是一些不存在的文件,而且也无需创建他们,这些目标称虚目标。
虚目标允许你强制执行某些事件,而这些事件在正常规则中不会发生。
虚目标总是使与之有关的命令被执行。

常见虚目标列表:
all   生成工程中所有可执行者,通常是 makefile 的第一个生成目标
clean  删除 make all 生成的所有文件
install  在系统目录中安装工程项目生成的可执行文件和文档
uninstall 删除 make install 安装的所有文件

例如,某安装包的 makefile 文件如下:

  1. InstallDir := /usr/local/bin/
  2. install:a b
  3. cp -f $^ $(InstallDir)
  4. cd $(InstallDir); chmod $^
  5. rm -f *.o $^
  6. uninstall:
  7. cd $(InstallDir); rm a b
  8. a:a.o
  9. gcc -o a a.o
  10. a.o:a.c
  11. gcc -c -o a.o a.c
  12. clean:
  13. rm -f *.o

执行 make install 即可安装。

有时候,为了防止 makefile 中的虚目标与实际文件重名,例如:实际路径中存在一个 install 文件,如果执行 make install ,则会报错。为了防止这种情况,可在虚目标前面加上修饰符,如下:

clean:

  rm -f *.o

.PHONY:clean

加上之后,即使有同名文件,也不会报错。

.PHONY 后可加多个虚目标,例如:

.PHONY: module module_install clean

下例执行 make all 可以生成所有目标:
all:test hello
test:test.o
 .....
hello:hello.o
 ....

makefile 常见错误:
1.制表符用空格代替。解决办法:cat -t makefile可查看makefile中的制表符:^I
2.连接符'\'和换行符之间插入了空格。解决办法:cat -e makefile。会将换行符用 $ 显示

Linux下make与makefile的更多相关文章

  1. Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)

    一.确认已经装好了GCC和Make的软件包 可以使用whereis命令查看: 如果whereis  gcc和whereis  make命令有结果,说明安装了这两个软件,可以继续往下做. 二.使用GCC ...

  2. Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入) 转

    http://www.crazyant.net/2011/10/29/linux%E4%B8%8Bgcc%E5%92%8Cmakefile%E5%AE%9E%E4%BE%8B%EF%BC%88%E4% ...

  3. linux下如何调试Makefile?

    答:make --debug=all (输出所有的调试信息)

  4. linux 下如何 makefile

    本文目的: 尝试着把makefile讲解清楚.非原创,仅仅是学习笔记和备忘录之用. makefile 的目的和好处: 一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefil ...

  5. Linux下MakeFile初探

    make是linux下的编译命令,用于编译和生成Linux下的可执行文件.这个命令处理的对象是Makefile,makefile等.由于make的强大解析能力,makefile文件的编写也变得极为简单 ...

  6. [转]Linux下的Makefile

    Makefile 介绍——————— make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序. 首先,我们用一个示例来说明Makefile的书写规则.以便 ...

  7. 【转载】Linux下makefile详解--跟我一起写 Makefile

    概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...

  8. Linux下C/C++程序开发管理(makefile)

    一.引言          从我们刚开始编写一个简单的C/C++ "Hello,World!",到将其编译.运行处结果—这部分工作IDE(集成开发环境)帮我们做了,包括语法错误检查 ...

  9. linux 下C语言编程库文件处理与Makefile编写

    做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...

随机推荐

  1. db2 import export load

    DB2中所谓的数据移动,包括: 1. 数据的导入(Import) 2. 数据的导出(Export) 3. 数据的装入(Load) 导入和装入都是利用DB2的相关命令把某种格式的文件中的数据保存到数据库 ...

  2. Test Driven Development

    链接:https://msdn.microsoft.com/zh-tw/library/dn743856.aspx

  3. web前端~~浏览器兼容问题(百度)

    所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的 ...

  4. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  5. 静态属性,直接把iis搞垮掉 Http error 503 Service Unavailable

    属性有个好处,可以在get的时候做一些特殊处理,比如返回一个默认值,正是这个特性,吸引我讲静态字段修改了成静态属性,代码如下: public static string 微信订阅号 { get { i ...

  6. MySQL、mybatis的查询条件-时间段

    1.配置文件中的写法 <if test="startTime !=null and startTime !='' "> <![CDATA[ and createT ...

  7. 配置Office 365单点登录摘要

    O365: 如果O365账号之前做过测试,则停用同步,强制删除已有用户涉及命令:Remove-MsolUser -UserPrincipalName zhang_san@company.cn (-Re ...

  8. asp.net core项目发布网站时的选项

    发布网站时的选项 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序. Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的, ...

  9. 关于(object sender, EventArgs e)

      sender是事件源 就是指发起这个事件的对象(控件)//表示触发事件的那个控件比如说你按下按钮,那么sender就是按钮 又如:textboxchange,sender就是该textbox,在事 ...

  10. 转: git复制到非空目录

    1. 进入非空目录,假设是 /workdir/proj1 2. git clone --no-checkout https://domain_or_ip/source.git tmp 3. mv tm ...