我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言make和Makefile介绍及使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言make和Makefile介绍及使用

1:make和Makefile的介绍:

概念

在软件的工程中的源文件是不计其数的,其按照类型,功能,模块分别放在若干个目录中,哪些文件需要编译,那些文件需要后编译,那些文件需要重新编译,甚至进行 更复杂的功能操作,这就引入了我们的系统编译的工具:

在linux和unix中,有一个强大的使用程序,叫make,可以用它来管理多模块程序的编译和链接,直至生成可执行文件

make使用程序读取一个说明文件,称为Makefile,Makefile文件中描述了整个软件工程的 编译规则和各个文件之间的依赖关系;

Makefile就像是一个Shell脚本一样,其中可以执行操作系统的命令,它带来的好处就是我们能够实现“自动化编译”,一旦写好,只要一个make命令,整个软件功能就完全自动编译,极大的提高了软件开发的效率;

make是一个命令工具,是一个解释Makefile中指令的命令工具,一般来说大多数IDE都有这个命令

使用make可以是重新编译的次数达到最小化;

2:make和Makefile

1:make的使用语法:

make使用语法:
    make [选项][目标][宏定义]
    选项列表:
        -d  显示调试信息(debug)
        -f<文件> 指定从那个文件中读取以来关系,默认文件是"Makefile"或者"makefile","-"表示从标准输入(file)
        -h  显示所有选项的简要说明(help)
        -n 不运行任何Makefile命令,只去现实它们(no)
        -s 安静的方式运行,不显示任何信息(silence)
    可以使用-h来获取更多的选项:

2:Makefile的编写原则和规则

当make命令不带选项运行的时候,它从Makefile中读取指定规则
当制定规则不同与Makefile(makefile)的其他文件中时候,就要运行带有-f选项的make命令。如make.fray.Makefile
make -f make.fray.Makefile

Makefile的编写规则一:

目标列表:关联性列表
<TAB>命令列表

目标列表:是用一个或者多个空格分开的目标文件的清单

关联性列表:同样是一个或者多个空格分开的目标文件,是目标列表所以来的多个目标文件的清单;

命令列表:用于创建目标文件的将要执行的命令清单,这个命令列表被换行符号分开,命令列表中的每个命令必须要以<TAB>字符开始;

如:##Sample
    power:power.c
        gcc -o power power.c

如:#Sample
    power:power.o demo.o
        gcc -o power power.o demo.o
    power.o:power.c
        gcc -o power.o -c power.c
    demo.o:demo.c
        gcc -o demo.o -c demo.c

注意:书写的形式类似于倒推的形式

Makefile的编写规则二:(不建议使用)

目标列表:关联性列表;命令列表
命令列表是一系列被分号隔开的命令,一个很长的命令行要续行的时候需要用一个反斜杠符号
如:all/mymath_test:class="lazy" data-src/mymath.c class="lazy" data-src/mymath_test.c; \
gcc -o all/mymath_test class="lazy" data-src/mymath.c  \  
class="lazy" data-src/mymath_test.c

注意:makefile书写主要注意的是:

  • 1:编译规则
  • 2:依赖关系
  • 3:倒推原理
  • 4:使用make命令去执行
  • 5:如果已经是最新的文件的时候,就不会再去编译执行了
  • 6:make去读取makefile的时候,是按照依赖文件的顺序去查找并且执行命令的
  • 7:make在编译的时候,如果发现被编译的文件已经是最新的了,就不会再去编译(减少了编译次数)
  • 8:make文件是根据被编译文件的时间戳去判断文件是否是当前最新的文件,如果是最新的,那么就会去重新编译,如果不是最新的,就不会去进行编译;
  • 9:千万要注意makefile中编译命令前面的分隔符

Makefile变量的使用

简单变量:
    定义
        变量名字:=[文本]
        这类变量的实质就是一组字符串
    添加
        变量名字+=[文本]或者 变量名字:=[文本][文本]
    引用变量
        $(变量名)
        $单字符变量(指的是但字符的变量 a:=123  $a)

        如:G:=gcc  一般我们都是定义成大写的
            $G -o power power.c

内置变量:
    $@   当前目标的名词
    $?   比当前目标更新的已修改的依赖性列表
    $<   依赖性列表的第一个文件
    $^   用空格分开的所有依赖性列表

虚目标

虚目标是不存在的文件
虚目标允许你去强制执行某些事件,但这些事件在正常的规则中是不会发生的 
虚目标不是真正的文件,make命令可以使用针对他们的任意规则
    虚目标总是使与之有关的命令被执行

all 生成工程中所有可以执行者,通常是makefile的第一个生成目标
test 运行程序的自动测试套件
clean 删除make all生成的所有文件
install 在系统目录中安装工程项目生成的可执行文件和文档
uninstall 删除make install安装的所有文件

特殊目标

make中有一些与定义的目标,这些预定义目标被make以一种特殊的方式进行处理,这些目标称为特殊目标;
.DEFAULTS  如果make找不到生成目标的任何makefile入口或后缀规则,就执行与目标相关的命令
.IGNORE  如果某一行makefile包含该目标,make忽略错误代码并继续建立,如果一个命令不正常存在,make自然会停止,带有-i选项的make命令可以执行相同的任务
.PHONY
    允许你指定一个不是文件的目标,所以您能只是make调用一系列makefile中的命令,即使在当前目录中有一个具有相同名字的文件
.SILENT
    make执行这些命令,但是不显示这些命令,带有-s的make可以执行相同的人物,
.SUFFIXES
    为目标指定的前提(后缀)可以与后缀规则相互关联,如果与目标没有相关性的前提,以存在的后缀列表就会被删除

默认模式规则

make中有许多预定义的规则成为后缀规则,它可以让make自动执行许多任务
为了建立一个目标,make会遍历一连串的依赖关系,这是为了决定从何处开始建立,如果没有找到目标文件,make就按有限顺序查找源文件       

默认模式规则:
    %o:%c
        $(CC) $(CFLAGS) -c $<
    $o:%s
        $(CC) $(AFLAGS) -o $@ $<

Makefile中的相关通配符:

#:注释
\:连接符号
关联列表和命令列表中可以使用shell通配符号? * %等

附上一个简单的makefile

#Sample
CC:=gcc
CFLAGS:=-Iinclude
CFLAGS+=-c
TARGET:=all/mytest_test3
DEPEND:=obj/mymath.o 
DEPEND+=obj/mymath_test.o

$(TARGET):$(DEPEND)
    $(CC) -o $@ $^
#obj/mymath.o:class="lazy" data-src/mymath.c
#   $(CC) -o $@ $(CFLAGS) $^
#obj/mymath_test.o:class="lazy" data-src/mymath_test.c
#   $(CC) -o $@ $(CFLAGS) $^

#使用make中的默认的模式规则
obj/%.o:class="lazy" data-src/%.c
    $(CC) -o $@ $(CFLAGS) $^ 



#声明clean是一个虚目标
.PHONY:clean
clean:
    rm -rf obj/mymath.o obj/mymath_test.o

到此这篇关于C语言make和Makefile介绍及使用的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言make和Makefile介绍及使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言中数组的介绍及使用

这篇文章主要讲解了“C语言中数组的介绍及使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中数组的介绍及使用”吧!目录数组一维数组初始化使用总结:内存存储二维数组创建初始化数组越界问题
2023-06-20

C语言中函数的介绍及用法

本篇内容介绍了“C语言中函数的介绍及用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录函数定义库函数定义介绍Example 1 strc
2023-06-20

C语言rand和srand函数使用方法介绍

rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。srand()用来设置rand()产生随机数时的随机数种子。参数seed是整数,通常可以利用time(0)或geypid(0)的返回值作为seed
2023-02-11

C语言中的makefile怎么使用

这篇“C语言中的makefile怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中的makefile怎么使用”文
2023-06-17

C语言中操作符的介绍及用法

这篇文章主要讲解了“C语言中操作符的介绍及用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中操作符的介绍及用法”吧!目录操作符分类算术操作符移位操作符整数存储规则左右移位规则赋值操作
2023-06-20

C语言中.与->的用法介绍

结构体用点,结构体指针用箭头,简单的说,就是一个快捷方式,一个语法糖,这篇文章主要介绍了C语言中.与->的区别及用法,需要的朋友可以参考下
2023-05-20

C语言各种符号的使用介绍上篇

C语言的基本符号就有20多个,每个符号可能同时具有多重含义,而且这些符号之间相互组合又使得C语言中的符号变得更加复杂起来
2022-11-13

C语言各种符号的使用介绍下篇

C 语言的基本符号就有 20 多个,每个符号可能同时具有多重含义,而且这些符号之间相互组合又使得 C 语言中的符号变得更加复杂起来
2022-11-13

C# FileStream简单介绍和使用

FileStream 是 C# 中用于操作文件的类,它提供了一种以字节为单位读取和写入文件的功能。使用 FileStream,可以实现文件的读取、写入和修改等操作。使用 FileStream 进行文件操作的基本步骤如下:1. 创建 File
2023-08-08

Go语言中make和new函数怎么使用

这篇文章主要讲解了“Go语言中make和new函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中make和new函数怎么使用”吧!相同点:make和new都是用来创建分配类
2023-07-02

C++移动语义详细介绍使用

首先,移动语义和完美转发这两个概念是在C++的模板编程的基础上,新增的特性,主要是配合模板来使用。本篇会从C++的值类型,到移动拷贝与移动赋值来理解移动语义与完美转发
2023-01-28

C++List链表的介绍和使用

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代,这篇文章主要介绍了C++List链表的介绍和使用,需要的朋友可以参考下
2023-03-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录