linux工程管理软件—make
一、make概述
make是一种代码维护工具make工具会根据makefile文件定义的规则和步骤,完成整个软件项目的代码维护工作。一般用来简化编译工作,可以极大地提高软件开发的效率。 windows下一般由集成开发环境自动生成
linux下需要由我们按照其语法自己编写
Make主要解决两个问题:
1.大量代码的关系维护
大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆及 维护把代码维护命令及编译命令写在makefile文件中,然后再用make工具解析此文 件自动执行相应命令,可实现代码的合理编译
2.减少重复编译时间
在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重 新编译,然后重新链接所有的目标文件,节省编译时间
二、makefile语法
makefile语法规则
目标:依赖文件列表
<Tab> 命令列表
1、目标:
通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也可是一个 动的名称
2、依赖文件:
是用来输入从而产生目标的文件一个目标通常有几个依赖文件(可以没有)
3、命令:
make执行的动作,一个规则可以含几个命令(可以没有)有多个命令时,每个命 令占一行
举例:

三、make命令
make命令格式:make [ -f file ] [options ] [ targets ]
1. [ -f file ] :
make默认在工作目录中寻找名为GUNmakefile、makefile、Makefile的文件作为makefile输入文件
-f可以指定以上名字以外的文件作为makefile输入文件
2. [ options ]
执行参数:辅助makefile执行
[ options ]的含义:
-v:显示make工具的版本信息
-w:在处理makefile之前和之后显示工作路径
-C dir:读取makefile之前改变工作路径至dir目录
-n:只打印要执行的命令但不执行
-s:执行但不显示执行的命令
3. [ targets ] :
若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目标,然后退出
指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用空格隔开)。

printf1.c和printf1.h文件在最后一次编译到printf1.o目标文件后没有改动,它们不需重新编译
main可以从源文件中重新编译并链接到没有改变的printf1.o目标文件。
printf1.c和printf1.h源文件有改动,make将在重新编译main之前自动重新编译printf1.o。
四、makefile变量
1.makefile变量类似于C语言中的宏,当makefile被make工具解析时,其中的变量会被展开。
2.变量的作用:
保存文件名列表
保存文件目录列表
保存编译器名
保存编译参数
保存编译的输出
3.makefile的变量分类:
(1)自定义变量
在makefile文件中定义的变量。
make工具传给makefile的变量
(2)系统环境变量
make工具解析makefile前,读取系统环境变量
并设置为makefile的变量。
(3)预定义变量(自动变量)
4.自定义变量语法
(1)定义变量:变量名=变量值
引用变量:$(变量名)或${变量名}
(2)makefile的变量名:makefile变量名可以以数字开头
(3)变量是大小写敏感的
(4)变量一般都在makefile的头部定义
(5)变量一般都在makefile的头部定义
(6)举例:

执行make命令时,make的参数options也可以给makefile设置变量。
makecc=arm-linux-gcc
执行make命令时,make的参数options也可以给makefile设置变量。
makecc=arm-linux-gcc
5.系统环境变量
(1)make工具会拷贝系统的环境变量并将其设置为makefile的变量,在 makefile中 可直接读取或修改拷贝后的变量
(2)举例:
新建makefile2
注释:@,只显示执行结果
终端执行:
export test=10
make clean –f makefile2
结果如下:

6. 预定义变量
makefile中有许多预定义变量,这些变量具有特殊的含义,可在makefile中直 接使用。
$@ 目标名
$* 目标名中除含扩展名的部分:扩展名包括:S、s、C、c、cc、cp、cpp、o、a等
$< 依赖文件列表中的第一个文件
$^ 依赖文件列表中除去重复文件的部分
$+ 依赖文件列表中所有的文件
$? 依赖文件列表中比目标文件新的文件
AR 归档维护程序的程序名,默认值为ar
ARFLAGS 归档维护程序的选项
AS 汇编程序的名称,默认值为as
ASFLAGS 汇编程序的选项
CC C编译器的名称,默认值为cc
CFLAGS C编译器的选项
CPP C预编译器的名称,默认值为$(CC) -E
CPPFLAGS C预编译的选项
CXX C++编译器的名称,默认值为g++
CXXFLAGS C++编译器的选项
---------------------------------------------------------------------------------------
附带三种变量的栗子:
编写Makefile完成计算器程序的编译,并通过假想目标(clean)清除目标文件

第一步:不使用任何变量完成功能
main:main.o add.o div.o mux.o sub.o
gcc main.o add.o div.omux.o sub.o -o main
main.o:main.c add.h div.h mux.h sub.h
gcc -c main.c -o main.o
add.o:add.c add.h
gcc -c add.c -o add.o
div.o:div.c div.h
gcc -c div.c -o div.o
mux.o:mux.c mux.h
gcc -c mux.c -o mux.o
sub.o:sub.c sub.h
gcc -c sub.c -o sub.o
clean:
rm *.o
第二步:使用自定义变量让程序更加通用
file=gcc
#file=gcc
obj:=main.o add.o div.o mux.o sub.o
target=main
cflags=-Wall -g
$(target):$(obj)
$(file) $(obj) -o$(target) $(cflags)
main.o:main.c add.h div.h mux.h sub.h
$(file) -c main.c -omain.o $(cflags)
add.o:add.c add.h
$(file) -c add.c -oadd.o $(cflags)
div.o:div.c div.h
$(file) -c div.c -odiv.o $(cflags)
mux.o:mux.c mux.h
$(file) -c mux.c -omux.o $(cflags)
sub.o:sub.c sub.h
$(file) -c sub.c -osub.o $(cflags)
clean:
rm $(obj) $(target)
第三步:使用预定义变量让程序更加通用
obj:=main.o add.o div.o mux.o sub.o
target=main
CFLAGS=-Wall -g
$(target):$(obj)
$(file) $^ -o $@$(CFLAGS)
main.o:main.c add.h div.h mux.h sub.h
$(file) -c $@ $(CFLAGS)
add.o:add.c add.h
$(file) -c $@ $(CFLAGS)
div.o:div.c div.h
$(file) -c $@ $(CFLAGS)
mux.o:mux.c mux.h
$(file) -c $@ $(CFLAGS)
sub.o:sub.c sub.h
$(file) -c $@ $(CFLAGS)
clean:
rm $(obj) $(target)
————————————————
版权声明:本文为CSDN博主「Amarao」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jinmie0193/article/details/79842137
linux工程管理软件—make的更多相关文章
- Linux工程管理器——make
一.定义 工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Make ...
- linux工程管理工具make入门
一.make工具的功能 1.主要负责一个软件工程中多个源代码的自动编译工作 2.还能进行环境检测.后期处理等工作: 3.make工具可以识别出工程中哪些文件已经被修改,并且在再次编译的时候只编译这些文 ...
- 5款Linux最佳照片管理软件
在谈到 Linux 中的应用程序时,对于不同的用户.不同的使用场景以及不同的使用习惯,在同一类应用当中,总会有多种软件可供选择和备选.就 Linux 中的照片管理软件来说,相信此前的 Google P ...
- Linux 管理软件
公司的openfire先前运行在windows上的,但由于在windows上openfire内存机制问题,最多只能占用2GB内存,且时间稍微长久一些就会自动挂掉,用户无法登陆和连接,因此迁移到了Cen ...
- Linux基础三(软件安装管理)
目录: 一.Linux 中软件包的分类 1.源码包 2.二进制包 3.源码包 4.软件安装的选择 二.软件安装之 RPM 1.背景知识 2.准备知识 3.安装升级与卸载 4.查询校验与提取 三.软件安 ...
- 如何在Linux上安装服务器管理软件Cockpit
Cockpit 是一个自由开源的服务器管理软件,使得我们可以通过它好看的 Web 前端界面轻松地管理我们的 GNU/Linux 服务器,非常轻量级,Web 界面也非常简单易用. Cockpit 使得 ...
- 在 Linux 上安装服务器管理软件 Cockpit
Cockpit 是一个自由开源的服务器管理软件,它使得我们可以通过它好看的 web 前端界面轻松地管理我们的 GNU/Linux 服务器.Cockpit 使得 linux 系统管理员.系统维护员和开发 ...
- Linux之yum软件管理
YUM yum = Yellow dog Updater, Modified主要功能是更方便的添加/删除/更新RPM包.它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题 yum特点 *可以 ...
- 学习总结:工程管理与makefile
工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...
随机推荐
- Redis 知识 整理
简介 安装 启动 注意事项 使用命令 通用命令 数据结构 字符串(string) 哈希(hash) 队列(list) 集合(set) 有序集合(zset) 位图(bitcount) 事务 订阅与发布 ...
- py-2 python介绍与安装
一.python介绍 1.python背景 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Py ...
- Access denied for user 'test'@'%' to database 'mysql'
1.问题描述 今天使用MySQL新建了一个用户,此处假设为test用户,用来作为某安装软件的配置用户(会新建大量的表及视图) mysql> create user 'test'@'%' iden ...
- 二:MySQL系列之SQL基本操作(二)
本篇主要介绍SOL语句的基本操作,主要有分为 连接数据库,创建数据库.创建数据表.添加数据记录,基本的查询功能等操作. 一.针对数据库的操作 -- 1.连接数据库 mysql -uroot -p my ...
- Formal Analysis of the TLS Handshake Protocol -----论文整理
1.关键词 TLS.SSL.Formal Analsysis Conridentiality Secerecy 2.Table THE SSL/TLS handshake Protocol 3 ...
- pypython解构
*******重点 解构:把线性结构的元素解开,并按顺序的赋给其他变量 左边接纳的要与右边解开的个数一致. lst = [3,5] first,second = lst print(first,sec ...
- 微服务学习及.net core入门教程
https://www.cnblogs.com/jackyfei/p/12067708.html https://www.cnblogs.com/jesse2013/ http://video.jes ...
- window.frameElement
地址:MDN web docs 比如有一个iframe的src是xxx.htmframeElement的作用就是在xxx.htm中获得这个引用它的iframe objet这样你就可以在xxx.htm改 ...
- win10 水晶报表安装包
windows 10 64 VS2013安装 CR For VS 13_0_18 安装过程没有报错 安装成功http://downloads.businessobjects.com/akdlm/cr4 ...
- Spring Cloud Eureka 注册中心高可用机制
一.Eureka 正常工作流程 Service 服务作为 Eureka Client 客户端需要在启动的时候就要向 Eureka Server 注册中心进行注册,并获取最新的服务列表数据. Eurek ...