C语言-Makefile

Makefile

  • 什么是make?
    • make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令
    • 这个命令存放在 /usr/bin/
  • 什么是 makefile?
    • makefile 是个文件,这个文件中描述了我们程序的编译规则
    • 咱们执行 make 命令的时候, make 命令会在当前目录下找 makefile 文件,根据 makefile 文件里的规则,编译程序。
  • 注意: Makefile 规则文件是,程序员根据自己的程序编写的编译规则
  • 采用 Makefile 的好处
    • 简化编译程序的时候输入的命令,编译的时候只需要敲 make 命令就可以了
    • 可以节省编译时间,提高编译效率

1. make概述

GNU make 是一种代码维护工具

② make 工具会 根据 makefile 文件定义的规则和步骤,完成整个软件项目的代码维护工作

一般用来简化编译工作,可以极大地提高软件开发的效率

④ windows 下一般由集成开发环境自动生成

⑤ linux 下需要由我们按照其语法自己编写

1.1 检查是否有 make命令

命令:检查版本

shell 复制代码
make --version

1.2 make 和 Makefile的区别

make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令
makefile 是个文件,这个文件中描述了项目资源的编译规则。

2. makefile

2.1 优点

  • 管理我们的源文件
  • 会检查每个源文件是否被修改 再次只会编译修改过的源文件(提高编译效率)

2.2 语法及使用

  • 语法:

    [变量名 = 变量值]
    [...]
    目标1:依赖文件列表
    <tab>编译命令1
    <tab>编译命令2

    目标2:依赖文件列表
    <tab>编译命令1
    <tab>编译命令2

    目标3:依赖文件列表
    <tab>编译命令1
    <tab>编译命令2
    ...

解释:

1、目标:通常是要产生的文件名称,目标可以是可执行文件或其它 obj 文件,也可是一个动作的名称

2、依赖文件:是用来输入从而产生目标的文件一个目标通常有几个依赖文件(可以没有)

3、命令:make 执行的动作,一个规则可以含几个命令(可以没有)有多个命令时,每个命令占一行

例:

makefile 复制代码
main:main.c
	gcc main.c -o main
clear:
	rm main

解释:其中 main 就是目标main.c 就是依赖文件gcc main.c -o main 就是命令

注意:

​ 当目标后面没有依赖文件,我们就将其称为假象目标

  • 使用:

在控制台输入 make 命令

注意:

  1. make 默认在工作目录中寻找名为 GNUmakefilemakefileMakefile 的文件作为 makefile 输入文件
  2. -f 可以指定以上名字以外的文件作为 makefile 输入文件
  3. 若使用 make 命令时没有指定目标,则 make 工具默认会实现 makefile 文件内的第一个目标,然后退出。

例:在控制台输入

1,输入make,默认执行makefile文件中第一个目标中命令
2,输入make 目标,执行makefile文件中指定的目标中的命令
3,当makefile的文件名不是GNUmakefile、makefile、Makefile时,可以输入make -f 文件名,指定makefile文件
  • 再次执行只会编译修改过的文件

各文件如下:


通过命令行运行多个文件:

步骤:

步骤1:编写makefile文件如下

makefile 复制代码
main:main.o myutils.o
	gcc main.o myutils.o -o main
clear:
	rm main *.o

步骤2:执行make命令查看,如下


步骤3:修改main.c文件,在次执行make命令

2.3 变量

2.3.1 分类
  • 系统变量:

    由系统提供的变量
    make工具会拷贝系统的环境变量并将其设置为 makefile 的变量,在 makefile中可直接读取或修改拷贝后的变量。
    查看系统变量命令:
    env
    修改或添加系统变量
    export 变量名=值
    注意
    export是导入的意思

注意:

  • 只是临时修改,当dos关闭后,将不在存在
  • 如:makefile编写如下
makefile 复制代码
main:main.o myutils.o
	gcc main.o myutils.o -o main
clear:
	rm main *.o
myprint:
	echo ${PWD}
  • 自定义变量(重点)

    程序员在编写makefile文件中自定义的变量

  • 预定义变量(重点)

    make命令提供的变量

2.3.2 自定义变量

语法:

定义变量:变量名=变量值
引用变量:$(变量名)或${变量名}

注意:

1、makefile 的变量名:makefile 变量名可以以数字开头

2、变量是大小写敏感的

3、变量一般都在 makefile 的头部定义

4、变量几乎可在 makefile 的任何地方使用

例:

makefile 复制代码
EXEc = main
OBJ = main.o utils.o
FLAGS = -Wall -g		
cc = gcc

$(EXEc):$(OBJ)
	$(cc) $(OBJ) -o $(EXEc) $(-Wall -g)
main.o:main.c
	$(cc) -c main.c -o main.o
utils.o:utils.c
	$(cc) -c utils.c -o utils.o
clear:
	rm $(EXEc) *.o
  • 引用变量:定义的变量 在下面用 $()${} 替换
  • -Wall -g:忽略所有警告
2.3.3 预定义变量
makefile 中有许多预定义变量,这些变量具有特殊的含义,可在 makefile 中直接使用。
    $@ 目标名
    $< 依赖文件列表中的第一个文件
    $^ 依赖文件列表中除去重复文件的部分
    
以下为了解
    AR 归档维护程序的程序名,默认值为 ar
    ARFLAGS 归档维护程序的选项
    AS 汇编程序的名称,默认值为 as
    ASFLAGS 汇编程序的选项
    cc c 编译器的名称,默认值为 gcc
    cFLAGS c 编译器的选项
    cPP c 预编译器的名称,默认值为$(cc) -E
    cPPFLAGS c 预编译的选项
    cXX c++编译器的名称,默认值为 g++
    cXXFLAGS c++编译器的选项

如:

makefile 复制代码
EXEc = main
OBJ = main.o utils.o
FLAGS = -Wall -g
cc = gcc

$(EXEc):$(OBJ)
	$(cc) $^ -o $@ $(-Wall -g)
#%:统配符
%.o:%.c
	$(cc) -c $< -o $@
clear:
	rm $(EXEc) *.o
相关推荐
老猿讲编程7 分钟前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk1 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*1 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue1 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man1 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
萧鼎2 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸2 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农2 小时前
Python 继承、多态、封装、抽象
开发语言·python
^velpro^2 小时前
数据库连接池的创建
java·开发语言·数据库
秋の花3 小时前
【JAVA基础】Java集合基础
java·开发语言·windows