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
相关推荐
碧海蓝天202211 分钟前
C++法则21:避免将#include放在命名空间内部。
开发语言·c++
兮动人19 分钟前
Java应用全链路故障排查实战指南:从系统资源到JVM深度诊断
java·开发语言·jvm
R-sz29 分钟前
导出word并且插入图片
开发语言·c#·word
CodeWithMe30 分钟前
【读书笔记】《C++ Software Design》第一章《The Art of Software Design》
开发语言·c++
脑袋大大的1 小时前
判断当前是否为钉钉环境
开发语言·前端·javascript·钉钉·企业应用开发
Wy. Lsy1 小时前
Kotlin基础学习记录
开发语言·学习·kotlin
Tanecious.2 小时前
C++--红黑树
开发语言·c++
Top`2 小时前
Java 泛型 (Generics)
java·开发语言·windows
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket
Shartin2 小时前
Can201-Introduction to Networking: Application Layer应用层
服务器·开发语言·php