Linux:编写Makefile

目录

前言

Makefile语法规则

Makefile实例


前言

一般而言,C/C++程序的执行过程包括如下步骤:

  • 预处理:主要对伪指令和特殊符号进行处理,将.c文件转为.i文件。
  • 编译:语义、语法分析,生成汇编语言代码,将.i文件转为.s文件。
  • 汇编:将汇编语言转化成机器可执行的指令,将.s文件转为.o文件。
  • 链接:将不同源文件产生的目标文件进行链接,从而形成一个可以执行的程序。

在Windows系统中进行C/C++程序开发时,程序员运行程序可以省去上述步骤而直接点击编译、运行即可,因为IDE会完成这些工作。而Linux系统没有IDE,因此程序员需要手动实现程序的编译。例如,若想要在Linux中运行hello.c文件,需要通过如下命令:

gcc hello.c -o hello
或
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.o -o hello

Linux中通常采用编写Makefile文件的方式来实现程序的编译。Makefile规定了工程的编译和链接规则。一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile就像一个shell脚本一样,也可以执行操作系统的命令。一旦写好Makefile文件,只须一个make命令,整个工程就会主动化编译,极大提高软件开发的效率。

Makefile语法规则

1、#表示注释;文件一般以Makefile或makefile命名

2、显示规则:表示生成某一目标文件需要哪些依赖文件及相应的指令

目标文件:依赖文件
[TAB]指令

在一个项目中,某一目标文件的依赖文件可能也有相应的依赖文件,为此在编写Makefile时第一个目标文件必须为最终目标,剩余部分需按递归的方式编写,例如下面是hello.c程序的Makefile和make结果:

注:1)在命令前加上@就不会显示命令;2)对于多条命令,若想在上一条命令的基础上执行下一条命令,应该使用“;”分隔这两条命令;3)支持多目标,即多个目标同时依赖于一个文件且其生成的命令大体类似;4)在命令前加上-表示命令执行有错的话忽略错误且继续执行

3、伪目标 .PHONY

.PHONY:label
label:
[TAB]指令

伪目标不是一个文件,make指令不会执行伪目标,要想执行伪目标需要make label

 

 4、变量:=(替换,可使用后面定义的变量) +=(追加) :=(常量,只能使用前面定义好的变量)

变量的使用:$(变量名)

变量的高级用法:1)“$(变量名:a=b)”或“${变量名:a=b}”表示把变量中所有以“a”字串“结尾”的“a”替换成“b”字串;$(变量名:%.c=%.o)表示将变量中的.c改成.o。2)$($($(变量名)))

一些特殊的变量:

  • 自动化变量: $^所有的依赖文件   $@所有的目标文件  $<依赖文件的第一个文件
  • 环境变量
  • 多行变量(可用于定义命令包):
define 变量名
赋值
endef
  • 目标变量(局部变量):
<target ...> : <variable-assignment>
<target ...> : overide <variable-assignment>

利用变量将hello.c的Makefile简化:

5、模式规则: 用%匹配任意非空字符串,比如“%.o:%.c”表示所有的.o文件依赖于对应的.c文件

6、通配符

*:表示任意一个或多个字符
?:表示任意一个字符
[…]:[abcd]表示a,b,c,d中任意一个字符,[^abcd]表示除a,b,c,d以外的字符
~:表示用户的home目录

7、文件指示:Makefile中引用其他Makefile; 指定Makefile中有效部分; 定义一个多行命令

8、文件搜寻

 *VPATH:执行make时先搜索当前路径,若没有要找的文件才去 VPATH 的路径中寻找

VPATH = 路径(多个路径之间用‘:’分隔)

*关键字vpath

8、函数:Makefile 中自带一些函数, 利用这些函数可以简化 Makefile 的编写

$(<函数名> <函数参数>)或${<函数名> <函数参数>}

9、嵌套执行make:在一些大工程中通常会把不同模块或是不同功能的源文件放在不同的目录中,因此可以在每个目录中都书写一个该目录的Makefile,这有利于让Makefile变得更加简洁而不至于把所有的东西全部写在一个Makefile中。

cd 路径 && make

10、条件判断

conditional-directive的关键字有ifeq、ifneq、ifdef、ifndef等

<conditional-directive>
<text-if-true>
else
<text-if-false>
endif

Makefile实例

首先给出如下的目录结构:

 Makefile文件的内容:

 终端编译结果如下:

 

 最后根据Makefile编写准则进行简化:

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值