一、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的更多相关文章

  1. Linux工程管理器——make

    一.定义 工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Make ...

  2. linux工程管理工具make入门

    一.make工具的功能 1.主要负责一个软件工程中多个源代码的自动编译工作 2.还能进行环境检测.后期处理等工作: 3.make工具可以识别出工程中哪些文件已经被修改,并且在再次编译的时候只编译这些文 ...

  3. 5款Linux最佳照片管理软件

    在谈到 Linux 中的应用程序时,对于不同的用户.不同的使用场景以及不同的使用习惯,在同一类应用当中,总会有多种软件可供选择和备选.就 Linux 中的照片管理软件来说,相信此前的 Google P ...

  4. Linux 管理软件

    公司的openfire先前运行在windows上的,但由于在windows上openfire内存机制问题,最多只能占用2GB内存,且时间稍微长久一些就会自动挂掉,用户无法登陆和连接,因此迁移到了Cen ...

  5. Linux基础三(软件安装管理)

    目录: 一.Linux 中软件包的分类 1.源码包 2.二进制包 3.源码包 4.软件安装的选择 二.软件安装之 RPM 1.背景知识 2.准备知识 3.安装升级与卸载 4.查询校验与提取 三.软件安 ...

  6. 如何在Linux上安装服务器管理软件Cockpit

    Cockpit 是一个自由开源的服务器管理软件,使得我们可以通过它好看的 Web 前端界面轻松地管理我们的 GNU/Linux 服务器,非常轻量级,Web 界面也非常简单易用. Cockpit 使得 ...

  7. 在 Linux 上安装服务器管理软件 Cockpit

    Cockpit 是一个自由开源的服务器管理软件,它使得我们可以通过它好看的 web 前端界面轻松地管理我们的 GNU/Linux 服务器.Cockpit 使得 linux 系统管理员.系统维护员和开发 ...

  8. Linux之yum软件管理

    YUM yum = Yellow dog Updater, Modified主要功能是更方便的添加/删除/更新RPM包.它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题 yum特点 *可以 ...

  9. 学习总结:工程管理与makefile

    工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...

随机推荐

  1. Robo 3T SQL

    查询指定日期,指定显示字段,排序,注释功能 db.getCollection('spuBasisInfo') .find({"createTime":{$gte:ISODate(& ...

  2. javascript_05-操作符

    一元运算符 a++和++a //5 2 3 var a =1; var b = ++a + ++a; console.log(b) //4 1 3 var a =1; var b = a++ + ++ ...

  3. c# VS.NET 中的调试工具

  4. django(模版)

    官方文档:https://docs.djangoproject.com/en/1.11/ref/templates/language/ 常用语法 Django模板中只需要记两种特殊符号: {{  }} ...

  5. 最基础的分类算法-k近邻算法 kNN简介及Jupyter基础实现及Python实现

    k-Nearest Neighbors简介 对于该图来说,x轴对应的是肿瘤的大小,y轴对应的是时间,蓝色样本表示恶性肿瘤,红色样本表示良性肿瘤,我们先假设k=3,这个k先不考虑怎么得到,先假设这个k是 ...

  6. CQRS的全称是Command Query Responsibility Segregation

    CQRS时,我们在讨论些神马?   当我写下这个标题的时候,我就有些后悔了,题目有点大,不太好控制.但我还是打算尝试一下,通过这篇内容来说清楚CQRS模式,以及和这个模式关联的其它东西.希望我能说得清 ...

  7. centos6.5上安装git

    亲测有效 https://blog.csdn.net/wxy540843763/article/details/80197301

  8. WPF 反编译后错误处理

    1. 首先,手动创建一个WPF工程(WpfApplicationReflectorDemo) 2. 把生成的WpfApplicationReflectorDemo.exe 拖到ILSpy里 3.点击 ...

  9. burp插件debug

    java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar burpsuite_community_v2. ...

  10. Spring Boot学习--spring-boot-starter-parent及starters(转)

    在官方文档的第三部分的13块讲述了引用的管理,官方推荐的是使用Maven和Gradle. 我一直在用的是maven,而且使用maven有些优势–spring-boot-starter-parent,这 ...