一、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. Python中的上下文管理器(contextlib模块)

    上下文管理器的任务是:代码块执行前准备,代码块执行后收拾 1 如何使用上下文管理器: 打开一个文件,并写入"hello world" filename="my.txt&q ...

  2. python之csv操作

    在使用python爬虫时或者其他情况,都会用到csv存储与读取的相关操作,我们在这里就浅谈一下: CSV(Comma-Separated Values)逗号分隔符,也就是每条记录中的值与值之间是用分号 ...

  3. Java Data JPA +hibernate 保存或者是查询遇到的坑

    由于项目需求,接触了Java Data JPA +hibernate,它的调用方式是controller调用service,service有实现的接口serviceimpl,serviceimpl调用 ...

  4. Luogu P2935 最好的地方Best Spot

    Luogu P2935 最好的地方Best Spot 这道题就是一道近乎裸的Floyd,因为数据很小,所以用领接表存图就可以了. #include<bits/stdc++.h> #defi ...

  5. Codeforces #503 C. Elections(贪心,逆向

    我的参考的博客地址 题目 逆向考虑. 暴力遍历 k(k是1到n/2+1 范围内的),挑出对于每一个k,记对于党派 i,num[ i ]为其票数.num[ i ]小于k-1的就不用改变投票了(这部分是比 ...

  6. appium+python+iOS 环境搭建,安装fbsimctl

    (1)设置postBuffer的值 开始如下的安装之前,需先修改postBuffer的值,默认的比较下,会导致下载大文件时失败, 参考链接:http://blog.sina.com.cn/s/blog ...

  7. TDOA 之 基站逻辑代码实现

    在前一篇博文里描述了基站的逻辑部分,这里贴出来具体代码实现.https://www.cnblogs.com/tuzhuke/p/11689881.html 1 Sync 信息部分 case 'S': ...

  8. html表格按长度换行

    <table style="table-layout:fixed; WORD-BREAK: break-all; WORD-WRAP: break-word; width:200px; ...

  9. jQuery相关方法8-----解绑事件

    一.解绑事件方法unbind() 用什么方式绑定的事件,最好用对应的方式解绑事件 unbind("事件名字")括号里写上事件名字,就会解除这个事件 unbind()括号里没有参数就 ...

  10. jQuery相关方法1

    一.设置某个元素的标签内容------.html()方法 <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js& ...