Makefile入门笔记

本文介绍了Linux下编程常用工具及其方式,重点讲解了Makefile的用途、基本语法、规则定义、变量、隐含规则和通配符的使用。通过实例展示了Makefile如何简化大型C/C++工程的编译过程,同时提到了Makefile与cmake的区别,以及多文件目录下Makefile的管理策略。
摘要由CSDN通过智能技术生成

Makefile

定义

  • Linux下用于编译大型C或C++工程时要用到的脚本语言

引子

  • 目前在Windows下编译大型工程,一般是在集成开发环境(IDE)下进行,如VC6.0,VS2008~2017,Dev,cfree等等,只需要点击编译按钮,即可生成最终的exe或dll文件,中间过程都隐藏了。
  • linux下用gcc编译C、C++工程, 可展示从源文件到最终的执行文件的整个微观过程。

linux下编程常用的工具及方式

  1. 虚拟机————安装Ubuntu操作系统
  2. SourceCRT————在windows系统下安装,配制虚拟机网关。控制linux的终端
  3. FileZila————远程上传工具,在windows和Linux之间传输文件

这种方式可以在windows下编写源代码文件,然后上传到linux下,进行编译并执行

源文件编译过程

预编译
  • linux命令:gcc -E XXX.C -o XXX.i
  • 将引用的头文件复制到源文件
  • 展开宏定义
汇编
  • Linux命令:gcc -S XXX.i -o XXX.S
  • 生成汇编代码

编译

  • Linux命令:gcc -c XXX.S -o XXX.o
  • 生成二进制文件

链接

  • LInux命令: gcc XXX.O -O XXX
  • 链接相关联的.o文件,生成最终的可执行文件.elf

问题:当只有一个源文件的时候,以这种命令行的形式去编译,是可以接受的,但对于大型工程,有几十,几百个源文件时,这种方法明显不现实。于是就有了Makefile,它是一门类似于python,shell的脚本语言,为了改善linux下编译大型C、C++工程编译问题而产生的

Makefile语法

创建一个文本文件,重命名为Makefile,且不需要后缀。

显示规则

  • 语法格式
目标文件:依赖文件
 
TAB+linux指令
  • 第一个目标文件是终极目标
  • 伪目标 .PHONY:
# 编译单个源文件
Hello : Hello.o
    gcc Hello.o -o Hello
Hello.o : Hello.S
    gcc -c Hello.S -o Hello.o
Hello.S : Hello.i
    gcc -S Hello.i -o Hello.S
Hello.i : Hello.c
    gcc -E Hello.c -o Hello.i

.PHONY:
#删除所有文件
clearAll:
    rm -rf Hello.i Hello.S Hello.o Hello
#删除中间文件
clear:
    rm -rf Hello.i Hello.S Hello.o
#编译多个源文件时
Test : cube.o circle.o main.o  
    gcc cube.o circle.o main.o -o Test
cube.o : cube.c
    #简化预编译和汇编过程
    gcc -c cube.c -o cube.o
circle.o : circle.c
    #简化预编译和汇编过程 
    gcc -c cirle..c -o circle.o
main.o : main.c
    gcc -c mian.c -o main.o

.PHONY:
#删除所有文件
clearAll:
    rm -rf cube.o circle.o main.o Test
#删除中间文件
clear:
    rm -rf cube.o circle.o main.o
  • linux下执行的时候,切换到Makefile文件所在文件夹,在命令行输入make,就可以执行Makefile中除伪目标之外的其他目标
  • 执行伪目标时,在命令行输入make 伪目标名,如make clearAll

变量

  • = 替换
  • += 追加
  • := 常量
#编译多个源文件时
#将目标或指令中的TAR全部替换成Test,使用变量:$(变量名)
TAR = Test
Obj = cube.o circle.o main.o
#将常量CC等价于gcc指令,不可更改,使用常量:$(常量名)
CC := gcc
$(TAR) : $(Obj)  
    $(CC) $(Obj) -o $(tar)
cube.o : cube.c
    #简化预编译和汇编过程
    $(CC) -c cube.c -o cube.o
circle.o : circle.c
    #简化预编译和汇编过程 
    $(CC) -c cirle..c -o circle.o
main.o : main.c
    $(CC) -c mian.c -o main.o

.PHONY:
#删除所有文件
clearAll:
    rm -rf $(Obj) $(TAR)
#删除中间文件
clear:
    rm -rf $(Obj)

隐含规则

  • %.c 表示任意的.c文件
  • %。o 表示任意的.o文件
  • *.c 表示所有的.c文件
  • *.o 表示所有的.o文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值