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 ...
随机推荐
- GNU/Linux 介绍
在了解Linux之前要先了解什么是GNU / GNU官方解释? GNU是一个自由软件操作系统.就是说,它尊重其使用者的自由.GNU操作系统包括GNU软件包(专门由GNU工程发布的程序)和由第三方发布的 ...
- Flutter——Drawer、DrawerHeader、UserAccountsDrawerHeader组件(侧边栏组件)
在 Scaffold 组件里面传入 drawer 参数可以定义左侧边栏,传入 endDrawer 可以定义右侧边栏.侧边栏默认是隐藏的,我们可以通过手指滑动显示侧边栏,也可以通过点击按钮显示侧边栏. ...
- 制作一个简单的部门员工知识分享的python抽取脚本
需求: 基于公司的文化和公司部门间以及员工之间的工作需求状态,或者想要了解某一些技能.专业方面的知识需求.促进并提高员工们的技能认知和技术水平. 详细代码如下: 先说一下存入csv表格的表头字段: 1 ...
- 安装腾讯QQ问题记录
安装腾讯QQ的时候遇到两个错误,记录一些解决方法 1.安装文件失败,请尝试手动卸载QQ或更改安装目录,再执行安装程序,错误码:0x00008013 问题原因:卸载QQ没有完全卸载,导致文件残留. 如果 ...
- Dotnet站点多个路由对应同一个Action的总结
需求:有些浏览器会屏蔽带有Ad字样的路径,此时需要创建多个路由指向同一个Action. 例如:原来 : http://lalalalalala.org:1506/api/advert/common ...
- 【恐怖的数组模拟】Secret Poems - HihoCoder - 1632
Secret Poems - HihoCoder - 1632 图一 图二 Following the order indicated by arrows, you can get “THISISAV ...
- linux下解决find 1000/gfs无权限
用find查找根目录下的文件时,比如sudo find . -name \*test,就会出现1000/gfs无权限的情况 用一下方法可以正常使用 sudo find . -name test 2&g ...
- SQL死锁处理
查询死锁 select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName from sys.d ...
- iptables 相关命令
1. 清除已有iptables规则 iptables -F iptables -X iptables -Z 2. 开放指定的端口(添加规则) iptables -A INPUT -s 127.0.0. ...
- 【解题报告】CSP2019-S D1T1 格雷码
题目链接:https://www.luogu.org/problem/P5657 话说这道题怎么是道橙题啊. 基本思路 因为n位格雷码的前2n-1位就是n-1位格雷码前面加了一位‘0’,所以可以把它们 ...